많은 사용자가있는 데이터 소스 (BindingList)가 있지만 DataGridView에 표시하지 않으려는 사용자가 있습니다. 그들을 숨길 수 있습니까? 작동하는 이벤트를 찾을 수 없습니다.C# DataSource를 사용하여 DataGridView의 행을 숨기는 방법
행을 추가하면 가끔씩 행이 숨겨집니다.
많은 사용자가있는 데이터 소스 (BindingList)가 있지만 DataGridView에 표시하지 않으려는 사용자가 있습니다. 그들을 숨길 수 있습니까? 작동하는 이벤트를 찾을 수 없습니다.C# DataSource를 사용하여 DataGridView의 행을 숨기는 방법
행을 추가하면 가끔씩 행이 숨겨집니다.
내 필터를 구현해야합니다. 모든 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
}
BindingSource.Filter
속성을 사용하여 행을 필터링 할 수 있습니다. 그러나 BindingList<T>
의 내장 구현은 필터링을 지원하지 않으므로 직접 구현해야합니다. Google에서 몇 가지 예를 찾을 수 있습니다. This one이 흥미롭게 보입니다 ...
추가 직렬화 : – Tarion
을 지원하려는 경우 [직렬화]이 예는 내 응용 프로그램에서 중요한 기능을 구현 도왔다. 공유해 주셔서 감사합니다. 너무 단순하게 들리는 것이 너무 복잡하다는 것을 누가 알았습니까? –