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.

War es hilfreich?

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...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top