سؤال

لدي مصدر بيانات (قائمة BINDING) مع العديد من المستخدمين، ولكن هناك بعض المستخدمين الذين لا أريد عرضهم في DataGridView. هل من الممكن إخفاءهم. لا أستطيع العثور على الأحداث التي تعمل.

فثافة في بعض الأحيان يخفي الصفوف Worng.

هل كانت مفيدة؟

المحلول

يبدو أنني يجب أن أقوم بتطبيق مرشحي الخاص. أقوم بإنشاء محول ل BindingList Wich يمكن أن يعرض إصدارا مفلدا من أي قائمة ربط. عليك فقط أن لاثم منه. هنا مثالي. أريد أن أظهر فقط للمستخدمين مع 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;

حسنا، خاصية المرشح غير مجدية، ومع ذلك. لكن فئة المحول تجريبية للغاية بعد. ولكن للحصول على إضافة وبسيطة وإزالة مع 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. هذا يبدوا مثيرا للأهتمام...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top