2009-09-21 11 views

답변

3

내 필터를 구현해야합니다. 모든 BindingList의 필터링 된 버전을 표시 할 수있는 BindingList 용 어댑터를 빌드합니다. 당신은 그걸 상속해야합니다. 여기에 나의 예가있다. 내가 = user.CanEdit 여기

public class AhpUserFilter : FilterBindingListAdapter<AhpUser> 
{ 

    public AhpUserFilter(AhpUserCollection users) 
     : base(users.GetList() as IBindingList) 
    { 

    } 

    protected override bool ISVisible(AhpUser user) 
    { 
     return user.CanEdit; 
    } 
} 

당신이 DataGridView에 새 목록을 결합 할 수있는 방법이다 진정한 사용자 만 보여주고 싶은 :

AhpUserFilter userSource = new AhpUserFilter(users); 
userSource.Filter = "yes!"; 

dataGridViewUser.DataSource = userSource; 

가 좋아, 필터 속성은 아직 쓸모가 없다. 하지만 Adapter 클래스는 아직 실험적입니다. 그러나 DataGrid를 사용하여 간단하게 추가하고 제거하는 것이 효과적입니다. 여기

는 어댑터에 대한 코드입니다

public class FilterBindingListAdapter<T> : BindingList<T>, IBindingListView 
{ 
    protected string filter = String.Empty; 
    protected IBindingList bindingList; 
    private bool filtering = false; 

    public FilterBindingListAdapter(IBindingList bindingList) 
    { 
     this.bindingList = bindingList; 
     DoFilter(); 
    } 


    protected override void OnListChanged(ListChangedEventArgs e) 
    { 
     if (!filtering) 
     { 
      switch (e.ListChangedType) 
      { 
       case ListChangedType.ItemAdded: 
        bindingList.Insert(e.NewIndex, this[e.NewIndex]); 
        break; 
      } 
     } 

     base.OnListChanged(e); 
    } 

    protected override void RemoveItem(int index) 
    { 
     if (!filtering) 
     { 
      bindingList.RemoveAt(index); 
     } 

     base.RemoveItem(index); 
    } 

    protected virtual void DoFilter() 
    { 
     filtering = true; 
     this.Clear(); 

     foreach (T e in bindingList) 
     { 
      if (filter.Length == 0 || this.ISVisible(e)) 
      { 
       this.Add((T)e); 
      } 
     } 
     filtering = false; 
    } 

    protected virtual bool ISVisible(T element) 
    { 
     return true; 
    } 


    #region IBindingListView Members 

    public void ApplySort(ListSortDescriptionCollection sorts) 
    { 
     throw new NotImplementedException(); 
    } 

    public string Filter 
    { 
     get 
     { 
      return filter; 
     } 
     set 
     { 
      filter = value; 
      DoFilter(); 
     } 
    } 

    public void RemoveFilter() 
    { 
     Filter = String.Empty; 
    } 

    public ListSortDescriptionCollection SortDescriptions 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public bool SupportsAdvancedSorting 
    { 
     get { return false; } 
    } 

    public bool SupportsFiltering 
    { 
     get { return true; } 
    } 

    #endregion 
} 
+0

추가 직렬화 : – Tarion

+0

을 지원하려는 경우 [직렬화]이 예는 내 응용 프로그램에서 중요한 기능을 구현 도왔다. 공유해 주셔서 감사합니다. 너무 단순하게 들리는 것이 너무 복잡하다는 것을 누가 알았습니까? –

2

BindingSource.Filter 속성을 사용하여 행을 필터링 할 수 있습니다. 그러나 BindingList<T>의 내장 구현은 필터링을 지원하지 않으므로 직접 구현해야합니다. Google에서 몇 가지 예를 찾을 수 있습니다. This one이 흥미롭게 보입니다 ...

관련 문제