Pregunta

Tengo una fuente de datos (BindingList) con muchos usuarios, pero hay algunos usuarios que no desea mostrar en mi DataGridView. ¿Es posible ocultarlos. No puedo encontrar eventos que funciona.

RowsAdded veces oculta filas worng.

¿Fue útil?

Solución

Parece que tengo que poner en práctica mi propio filtro. Construyo un adaptador para el wich BindingList puede mostrar una versión filtrada de cualquier BindingList. Usted sólo tiene que inherite de ella. Aquí está mi ejemplo. Quiero sólo los usuarios con user.CanEdit mostrar = true

public class AhpUserFilter : FilterBindingListAdapter<AhpUser>
{

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

    }

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

Aquí es cómo se puede obligar a la nueva lista a un DataGridView:

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

dataGridViewUser.DataSource = userSource;

De acuerdo, la propiedad Filter es inútil, todavía. Pero la clase adaptador es muy experimental todavía. Sin embargo, para la adición simple y retirar con una cuadrícula de datos parece que funciona bien.

Aquí está el código para el adaptador:

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
}

Otros consejos

Puede filtrar las filas con la propiedad BindingSource.Filter. Sin embargo, la aplicación integrada de BindingList<T> no admite el filtrado, por lo que es necesario implementar por sí mismo. Puede encontrar algunos ejemplos en Google. Éste parece interesante ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top