C# So verbergen Sie eine Zeile in einer DataGridView mit DataSource
-
12-09-2019 - |
Frage
Ich habe eine DataSource (BindingList) mit vielen Benutzern, aber es gibt einige Benutzer, die ich in meiner DataGridView nicht anzeigen möchte. Ist es möglich, sie zu verbergen? Ich kann keine Ereignisse finden, die funktionieren.
Reihen versteckt manchmal abgenutzte Reihen.
Lösung
Sieht so aus, als müsste ich meinen eigenen Filter implementieren. Ich erstelle einen Adapter für die Bindinglist, die eine gefilterte Version einer beliebigen Bindungsliste anzeigen kann. Sie müssen nur von ihm ineriten. Hier ist mein Beispiel. Ich möchte nur Benutzer mit user.canedit = true zeigen
public class AhpUserFilter : FilterBindingListAdapter<AhpUser>
{
public AhpUserFilter(AhpUserCollection users)
: base(users.GetList() as IBindingList)
{
}
protected override bool ISVisible(AhpUser user)
{
return user.CanEdit;
}
}
So können Sie die neue Liste an eine DataGridView binden:
AhpUserFilter userSource = new AhpUserFilter(users);
userSource.Filter = "yes!";
dataGridViewUser.DataSource = userSource;
Okay, die Filtereigenschaft ist noch nutzlos. Aber die Adapterklasse ist noch sehr experimentell. Aber zum einfachen Hinzufügen und Entfernen mit einem Datagrid scheint es gut zu funktionieren.
Hier ist der Code für den Adapter:
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
}
Andere Tipps
Sie können die Zeilen mit dem filtern BindingSource.Filter
Eigentum. Die integrierte Implementierung von jedoch BindingList<T>
Unterstützt die Filterung nicht, daher müssen Sie es selbst implementieren. Auf Google finden Sie einige Beispiele. Dieses sieht interessant aus...