IBindingList 接口

定义

提供在绑定到数据源时支持复杂方案和简单方案所需的功能。

C#
public interface IBindingList : System.Collections.IList
派生
实现

示例

以下示例提供了 接口的 IBindingList 简单实现。 类 CustomerList 将客户信息存储在列表中。 此示例假定你已使用 Customer 可在 类的 示例中找到的 IEditableObject 类。

C#
public class CustomersList :  CollectionBase, IBindingList
{

    private ListChangedEventArgs resetEvent = new ListChangedEventArgs(ListChangedType.Reset, -1);
    private ListChangedEventHandler onListChanged;

    public void LoadCustomers()
    {
        IList l = (IList)this;
        l.Add(ReadCustomer1());
        l.Add(ReadCustomer2());
        OnListChanged(resetEvent);
    }

    public Customer this[int index]
    {
        get
        {
            return (Customer)(List[index]);
        }
        set
        {
            List[index] = value;
        }
    }

    public int Add (Customer value)
    {
        return List.Add(value);
    }

    public Customer AddNew()
    {
        return (Customer)((IBindingList)this).AddNew();
    }

    public void Remove (Customer value)
    {
        List.Remove(value);
    }

    protected virtual void OnListChanged(ListChangedEventArgs ev)
    {
        if (onListChanged != null)
        {
            onListChanged(this, ev);
        }
    }

    protected override void OnClear()
    {
        foreach (Customer c in List)
        {
            c.Parent = null;
        }
    }

    protected override void OnClearComplete()
    {
        OnListChanged(resetEvent);
    }

    protected override void OnInsertComplete(int index, object value)
    {
        Customer c = (Customer)value;
        c.Parent = this;
        OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, index));
    }

    protected override void OnRemoveComplete(int index, object value)
    {
        Customer c = (Customer)value;
        c.Parent = this;
        OnListChanged(new ListChangedEventArgs(ListChangedType.ItemDeleted, index));
    }

    protected override void OnSetComplete(int index, object oldValue, object newValue)
    {
        if (oldValue != newValue)
        {

            Customer oldcust = (Customer)oldValue;
            Customer newcust = (Customer)newValue;

            oldcust.Parent = null;
            newcust.Parent = this;

            OnListChanged(new ListChangedEventArgs(ListChangedType.ItemAdded, index));
        }
    }

    // Called by Customer when it changes.
    internal void CustomerChanged(Customer cust)
    {
        
        int index = List.IndexOf(cust);

        OnListChanged(new ListChangedEventArgs(ListChangedType.ItemChanged, index));
    }

    // Implements IBindingList.
    bool IBindingList.AllowEdit
    {
        get { return true ; }
    }

    bool IBindingList.AllowNew
    {
        get { return true ; }
    }

    bool IBindingList.AllowRemove
    {
        get { return true ; }
    }

    bool IBindingList.SupportsChangeNotification
    {
        get { return true ; }
    }

    bool IBindingList.SupportsSearching
    {
        get { return false ; }
    }

    bool IBindingList.SupportsSorting
    {
        get { return false ; }
    }

    // Events.
    public event ListChangedEventHandler ListChanged
    {
        add
        {
            onListChanged += value;
        }
        remove
        {
            onListChanged -= value;
        }
    }

    // Methods.
    object IBindingList.AddNew()
    {
        Customer c = new Customer(this.Count.ToString());
        List.Add(c);
        return c;
    }

    // Unsupported properties.
    bool IBindingList.IsSorted
    {
        get { throw new NotSupportedException(); }
    }

    ListSortDirection IBindingList.SortDirection
    {
        get { throw new NotSupportedException(); }
    }

    PropertyDescriptor IBindingList.SortProperty
    {
        get { throw new NotSupportedException(); }
    }

    // Unsupported Methods.
    void IBindingList.AddIndex(PropertyDescriptor property)
    {
        throw new NotSupportedException();
    }

    void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction)
    {
        throw new NotSupportedException();
    }

    int IBindingList.Find(PropertyDescriptor property, object key)
    {
        throw new NotSupportedException();
    }

    void IBindingList.RemoveIndex(PropertyDescriptor property)
    {
        throw new NotSupportedException();
    }

    void IBindingList.RemoveSort()
    {
        throw new NotSupportedException();
    }

    // Worker functions to populate the list with data.
    private static Customer ReadCustomer1()
    {
        Customer cust = new Customer("536-45-1245");
        cust.FirstName = "Jo";
        cust.LastName = "Brown";
        return cust;
    }

    private static Customer ReadCustomer2()
    {
        Customer cust = new Customer("246-12-5645");
        cust.FirstName = "Robert";
        cust.LastName = "Brown";
        return cust;
    }
}

注解

此接口由 DataView 类实现。 方法的实现应表现出与类中 DataView 该方法的实现相同的行为。

调用 ApplySortRemoveSort 方法时,应使用 枚举引发 ListChanged 事件 Reset

调用 AddNew 方法时,应引发包含 ListChanged 相应索引的 ItemAdded 枚举的事件。 添加的行处于按控件上的 DataGridView ESC 可以删除新行的状态。 ListChanged再次对此行引发具有 ItemAdded 枚举的事件表示该项现在是一个不处于“新”状态的行。

删除项或对新行调用 CancelEdit 方法时, (如果该行实现 IEditableObject) ,则应引发 ListChanged 包含相应索引的 ItemDeleted 枚举的事件。

属性

AllowEdit

获取是否可更新列表中的项。

AllowNew

获取是否可以使用 AddNew() 向列表中添加项。

AllowRemove

获取是否可以使用 Remove(Object)RemoveAt(Int32) 从列表中移除项。

Count

获取 ICollection 中包含的元素数。

(继承自 ICollection)
IsFixedSize

获取一个值,该值指示 IList 是否具有固定大小。

(继承自 IList)
IsReadOnly

获取一个值,该值指示 IList 是否为只读。

(继承自 IList)
IsSorted

获取是否对列表中的项进行排序。

IsSynchronized

获取一个值,该值指示是否同步对 ICollection 的访问(线程安全)。

(继承自 ICollection)
Item[Int32]

获取或设置指定索引处的元素。

(继承自 IList)
SortDirection

获取排序的方向。

SortProperty

获取正在用于排序的 PropertyDescriptor

SupportsChangeNotification

获取当列表更改或列表中的项更改时是否引发 ListChanged 事件。

SupportsSearching

获取列表是否支持使用 Find(PropertyDescriptor, Object) 方法进行搜索。

SupportsSorting

获取列表是否支持排序。

SyncRoot

获取可用于同步对 ICollection 的访问的对象。

(继承自 ICollection)

方法

Add(Object)

将某项添加到 IList 中。

(继承自 IList)
AddIndex(PropertyDescriptor)

PropertyDescriptor 添加到用于搜索的索引。

AddNew()

将新项添加到列表。

ApplySort(PropertyDescriptor, ListSortDirection)

根据 PropertyDescriptorListSortDirection 对列表进行排序。

Clear()

IList 中移除所有项。

(继承自 IList)
Contains(Object)

确定 IList 是否包含特定值。

(继承自 IList)
CopyTo(Array, Int32)

从特定的 ICollection 索引开始,将 Array 的元素复制到一个 Array 中。

(继承自 ICollection)
Find(PropertyDescriptor, Object)

返回具有给定 PropertyDescriptor 的行的索引。

GetEnumerator()

返回循环访问集合的枚举数。

(继承自 IEnumerable)
IndexOf(Object)

确定 IList 中特定项的索引。

(继承自 IList)
Insert(Int32, Object)

IList 中的指定索引处插入一个项。

(继承自 IList)
Remove(Object)

IList 中移除特定对象的第一个匹配项。

(继承自 IList)
RemoveAt(Int32)

移除位于指定索引处的 IList 项。

(继承自 IList)
RemoveIndex(PropertyDescriptor)

PropertyDescriptor 从用于搜索的索引中移除。

RemoveSort()

使用 ApplySort(PropertyDescriptor, ListSortDirection) 移除任何已应用的排序。

事件

ListChanged

当列表或列表中的项更改时发生。

扩展方法

Cast<TResult>(IEnumerable)

IEnumerable 的元素强制转换为指定的类型。

OfType<TResult>(IEnumerable)

根据指定类型筛选 IEnumerable 的元素。

AsParallel(IEnumerable)

启用查询的并行化。

AsQueryable(IEnumerable)

IEnumerable 转换为 IQueryable

适用于

产品 版本
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1