Question

J'ai une source de données (BindingList) avec de nombreux utilisateurs, mais il y a des utilisateurs que je ne veux pas afficher dans mon DataGridView. Est-il possible de les cacher. Je ne peux pas trouver des événements qui fonctionne.

RowsAdded parfois cache des lignes worng.

Était-ce utile?

La solution

On dirait que je dois mettre en œuvre mon propre filtre. Je construis un adaptateur pour le Wich BindingList peut afficher une version filtrée de toute BindingList. Vous a juste inherite de lui. Voici mon exemple. Je veux montrer que les utilisateurs avec user.CanEdit = true

public class AhpUserFilter : FilterBindingListAdapter<AhpUser>
{

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

    }

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

Voici comment vous pouvez lier la nouvelle liste à un datagridview:

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

dataGridViewUser.DataSource = userSource;

D'accord, la propriété Filter est inutile, encore. Mais la classe d'adaptateur est encore très expérimental. Mais pour simplement l'ajout et la suppression d'un DataGrid il semble bien fonctionner.

Voici le code pour l'adaptateur:

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
}

Autres conseils

Vous pouvez filtrer les lignes avec la propriété BindingSource.Filter. Cependant, la mise en œuvre de BindingList<T> intégré ne supporte pas le filtrage, vous devez implémenter vous-même. Vous pouvez trouver quelques exemples sur Google. Celui semble intéressant ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top