IBindingList IBindingList IBindingList IBindingList Interface

定义

提供在绑定到数据源时支持复杂方案和简单方案所需的功能。Provides the features required to support both complex and simple scenarios when binding to a data source.

public interface class IBindingList : System::Collections::IList
public interface IBindingList : System.Collections.IList
type IBindingList = interface
    interface IList
    interface ICollection
    interface IEnumerable
Public Interface IBindingList
Implements IList
派生
实现

示例

下面的示例提供IBindingList接口的简单实现。The following example provides a simple implementation of the IBindingList interface. CustomerList类在列表中存储客户信息。The CustomerList class stores customer information in a list. 此示例假设你已使用Customer可在IEditableObject类中的示例中找到的类。This example assumes that you have used the Customer class that can be found in the example in the IEditableObject class.

public ref class CustomersList: public CollectionBase, public IBindingList
{
private:
   ListChangedEventArgs^ resetEvent;
   ListChangedEventHandler^ onListChanged;
   virtual event ListChangedEventHandler^ ListChanged;

public:
   property bool AllowEdit 
   {
      // Implements IBindingList.
      virtual bool get() sealed
      {
         return true;
      }
   }

   virtual property bool AllowNew 
   {
      bool get()
      {
         return true;
      }
   }

   property bool AllowRemove 
   {
      virtual bool get()
      {
         return true;
      }

   }

   property bool SupportsChangeNotification 
   {
      virtual bool get()
      {
         return true;
      }

   }

   property bool SupportsSearching 
   {
      virtual bool get()
      {
         return true;
      }

   }

   property bool SupportsSorting 
   {
      virtual bool get()
      {
         return true;
      }

   }

   // Methods.
   virtual Object^ AddNew()
   {
      Customer^ c = gcnew Customer( this->Count->ToString() );
      List->Add( c );
      return c;
   }


   property bool IsSorted 
   {

      // Unsupported properties.
      virtual bool get()
      {
         throw gcnew NotSupportedException;
         return false;
      }

   }

   property ListSortDirection SortDirection 
   {
      virtual ListSortDirection get()
      {
         throw gcnew NotSupportedException;
         return ListSortDirection::Ascending;
      }

   }

   property PropertyDescriptor^ SortProperty 
   {
      virtual PropertyDescriptor^ get()
      {
         throw gcnew NotSupportedException;
         return nullptr;
      }

   }

   // Unsupported Methods.
   virtual void AddIndex( PropertyDescriptor^ property )
   {
      throw gcnew NotSupportedException;
   }

   virtual void ApplySort( PropertyDescriptor^ property, ListSortDirection direction )
   {
      throw gcnew NotSupportedException;
   }

   virtual int Find( PropertyDescriptor^ property, Object^ key )
   {
      throw gcnew NotSupportedException;
      return 0;
   }

   virtual void RemoveIndex( PropertyDescriptor^ property )
   {
      throw gcnew NotSupportedException;
   }

   virtual void RemoveSort()
   {
      throw gcnew NotSupportedException;
   }


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

   static Customer^ ReadCustomer2()
   {
      Customer^ cust = gcnew Customer( "246-12-5645" );
      cust->FirstName = "Robert";
      cust->LastName = "Brown";
      return cust;
   }

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

   virtual void OnClear() override
   {
      List->Clear();
   }

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

   virtual void OnInsertComplete( int index, Object^ value ) override
   {
      Customer^ c = safe_cast<Customer^>(value);
      c->Parent = this;
      OnListChanged( gcnew ListChangedEventArgs( ListChangedType::ItemAdded,index ) );
   }

   virtual void OnRemoveComplete( int index, Object^ value ) override
   {
      Customer^ c = safe_cast<Customer^>(value);
      c->Parent = this;
      OnListChanged( gcnew ListChangedEventArgs( ListChangedType::ItemDeleted,index ) );
   }

   virtual void OnSetComplete( int index, Object^ oldValue, Object^ newValue ) override
   {
      if ( oldValue != newValue )
      {
         Customer^ oldcust = safe_cast<Customer^>(oldValue);
         Customer^ newcust = safe_cast<Customer^>(newValue);
         oldcust->Parent = 0;
         newcust->Parent = this;
         OnListChanged( gcnew ListChangedEventArgs( ListChangedType::ItemAdded,index ) );
      }
   }

public:

   // Constructor
   CustomersList()
   {
      resetEvent = gcnew ListChangedEventArgs( ListChangedType::Reset,-1 );
   }

   void LoadCustomers()
   {
      IList^ l = static_cast<IList^>(this);
      l->Add( ReadCustomer1() );
      l->Add( ReadCustomer2() );
      OnListChanged( resetEvent );
   }

   property Object^ Item [int]
   {
      Object^ get( int index )
      {
         return static_cast<Customer^>(List->Item[ index ]);
      }

      void set( int index, Object^ value )
      {
         List->Item[ index ] = value;
      }

   }
   int Add( Customer^ value )
   {
      return List->Add( value );
   }

   Customer^ AddNew()
   {
      return safe_cast<Customer^>(static_cast<IBindingList^>(this)->AddNew());
   }

   void Remove( Customer^ value )
   {
      List->Remove( value );
   }

internal:

   // Called by Customer when it changes.
   void CustomerChanged( Customer^ cust )
   {
      int index = List->IndexOf( cust );
      OnListChanged( gcnew ListChangedEventArgs( ListChangedType::ItemChanged,index ) );
   }

};
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;
	}
}

Public Class CustomersList
    Inherits CollectionBase
    Implements IBindingList 

    Private resetEvent As New ListChangedEventArgs(ListChangedType.Reset, -1)
    Private onListChanged1 As ListChangedEventHandler


    Public Sub LoadCustomers()
        Dim l As IList = CType(Me, IList)
        l.Add(ReadCustomer1())
        l.Add(ReadCustomer2())
        OnListChanged(resetEvent)
    End Sub 


    Default Public Property Item(ByVal index As Integer) As Customer
        Get
            Return CType(List(index), Customer)
        End Get
        Set(ByVal Value As Customer)
            List(index) = Value
        End Set
    End Property


    Public Function Add(ByVal value As Customer) As Integer
        Return List.Add(value)
    End Function 


    Public Function AddNew2() As Customer
        Return CType(CType(Me, IBindingList).AddNew(), Customer)
    End Function 


    Public Sub Remove(ByVal value As Customer)
        List.Remove(value)
    End Sub 



    Protected Overridable Sub OnListChanged(ByVal ev As ListChangedEventArgs)
        If (onListChanged1 IsNot Nothing) Then
            onListChanged1(Me, ev)
        End If
    End Sub 



    Protected Overrides Sub OnClear()
        Dim c As Customer
        For Each c In List
            c.parent = Nothing
        Next c
    End Sub 


    Protected Overrides Sub OnClearComplete()
        OnListChanged(resetEvent)
    End Sub 


    Protected Overrides Sub OnInsertComplete(ByVal index As Integer, ByVal value As Object)
        Dim c As Customer = CType(value, Customer)
        c.parent = Me
        OnListChanged(New ListChangedEventArgs(ListChangedType.ItemAdded, index))
    End Sub 


    Protected Overrides Sub OnRemoveComplete(ByVal index As Integer, ByVal value As Object)
        Dim c As Customer = CType(value, Customer)
        c.parent = Me
        OnListChanged(New ListChangedEventArgs(ListChangedType.ItemDeleted, index))
    End Sub 


    Protected Overrides Sub OnSetComplete(ByVal index As Integer, ByVal oldValue As Object, ByVal newValue As Object)
        If oldValue <> newValue Then

            Dim oldcust As Customer = CType(oldValue, Customer)
            Dim newcust As Customer = CType(newValue, Customer)

            oldcust.parent = Nothing
            newcust.parent = Me

            OnListChanged(New ListChangedEventArgs(ListChangedType.ItemAdded, index))
        End If
    End Sub 


    ' Called by Customer when it changes.
    Friend Sub CustomerChanged(ByVal cust As Customer)
        Dim index As Integer = List.IndexOf(cust)
        OnListChanged(New ListChangedEventArgs(ListChangedType.ItemChanged, index))
    End Sub 


    ' Implements IBindingList.

    ReadOnly Property AllowEdit() As Boolean Implements IBindingList.AllowEdit
        Get
            Return True
        End Get
    End Property

    ReadOnly Property AllowNew() As Boolean Implements IBindingList.AllowNew
        Get
            Return True
        End Get
    End Property

    ReadOnly Property AllowRemove() As Boolean Implements IBindingList.AllowRemove
        Get
            Return True
        End Get
    End Property

    ReadOnly Property SupportsChangeNotification() As Boolean Implements IBindingList.SupportsChangeNotification
        Get
            Return True
        End Get
    End Property

    ReadOnly Property SupportsSearching() As Boolean Implements IBindingList.SupportsSearching
        Get
            Return False
        End Get
    End Property

    ReadOnly Property SupportsSorting() As Boolean Implements IBindingList.SupportsSorting
        Get
            Return False
        End Get
    End Property

    ' Events.
    Public Event ListChanged As ListChangedEventHandler Implements IBindingList.ListChanged


    ' Methods.
    Function AddNew() As Object Implements IBindingList.AddNew
        Dim c As New Customer(Me.Count.ToString())
        List.Add(c)
        Return c
    End Function 


    ' Unsupported properties.

    ReadOnly Property IsSorted() As Boolean Implements IBindingList.IsSorted
        Get
            Throw New NotSupportedException()
        End Get
    End Property

    ReadOnly Property SortDirection() As ListSortDirection Implements IBindingList.SortDirection
        Get
            Throw New NotSupportedException()
        End Get
    End Property


    ReadOnly Property SortProperty() As PropertyDescriptor Implements IBindingList.SortProperty
        Get
            Throw New NotSupportedException()
        End Get
    End Property


    ' Unsupported Methods.
    Sub AddIndex(ByVal prop As PropertyDescriptor) Implements IBindingList.AddIndex
        Throw New NotSupportedException()
    End Sub 


    Sub ApplySort(ByVal prop As PropertyDescriptor, ByVal direction As ListSortDirection) Implements IBindingList.ApplySort
        Throw New NotSupportedException()
    End Sub 


    Function Find(ByVal prop As PropertyDescriptor, ByVal key As Object) As Integer Implements IBindingList.Find
        Throw New NotSupportedException()
    End Function 


    Sub RemoveIndex(ByVal prop As PropertyDescriptor) Implements IBindingList.RemoveIndex
        Throw New NotSupportedException()
    End Sub 


    Sub RemoveSort() Implements IBindingList.RemoveSort
        Throw New NotSupportedException()
    End Sub 


    ' Worker functions to populate the list with data.
    Private Shared Function ReadCustomer1() As Customer
        Dim cust As New Customer("536-45-1245")
        cust.FirstName = "Jo"
        cust.LastName = "Brown"
        Return cust
    End Function 


    Private Shared Function ReadCustomer2() As Customer
        Dim cust As New Customer("246-12-5645")
        cust.FirstName = "Robert"
        cust.LastName = "Brown"
        Return cust
    End Function 
End Class

注解

此接口由DataView类实现。This interface is implemented by the DataView class. 方法的实现应显示与DataView类中该方法的实现相同的行为。Implementation of a method should exhibit the same behavior as the implementation of that method in the DataView class.

调用ApplySortRemoveSort方法时ListChanged ,应Reset引发带有枚举的事件。When you call the ApplySort or RemoveSort methods, you should raise a ListChanged event with the Reset enumeration.

调用AddNew方法时, 应ListChanged引发带有包含ItemAdded相应索引的枚举的事件。When you call the AddNew method, you should raise a ListChanged event with the ItemAdded enumeration carrying the appropriate index. 添加的行处于一种状态, 在该状态下, DataGridView按下 ESC 可以删除新行。The added row is in a state where pressing the ESC on a DataGridView control can remove the new row. 第二次ItemAdded使用枚举引发事件时,第二次指示该项现在为不处于"新"状态的行。ListChangedRaising the ListChanged event with the ItemAdded enumeration a second time on this row indicates that the item is now a row not in the "new" state.

当您删除某个项或对新CancelEdit行调用该方法时 (如果该行实现IEditableObject) ListChanged , 则应ItemDeleted引发包含带有相应索引的枚举的事件。When you remove an item or call the CancelEdit method on a new row (if that row implements IEditableObject), you should raise a ListChanged event with the ItemDeleted enumeration carrying the appropriate index.

属性

AllowEdit AllowEdit AllowEdit AllowEdit

获取是否可更新列表中的项。Gets whether you can update items in the list.

AllowNew AllowNew AllowNew AllowNew

获取是否可以使用 AddNew() 向列表中添加项。Gets whether you can add items to the list using AddNew().

AllowRemove AllowRemove AllowRemove AllowRemove

获取是否可以使用 Remove(Object)RemoveAt(Int32) 从列表中移除项。Gets whether you can remove items from the list, using Remove(Object) or RemoveAt(Int32).

Count Count Count Count

获取 ICollection 中包含的元素数。Gets the number of elements contained in the ICollection.

(Inherited from ICollection)
IsFixedSize IsFixedSize IsFixedSize IsFixedSize

获取一个值,该值指示 IList 是否具有固定大小。Gets a value indicating whether the IList has a fixed size.

(Inherited from IList)
IsReadOnly IsReadOnly IsReadOnly IsReadOnly

获取一个值,该值指示 IList 是否为只读。Gets a value indicating whether the IList is read-only.

(Inherited from IList)
IsSorted IsSorted IsSorted IsSorted

获取是否对列表中的项进行排序。Gets whether the items in the list are sorted.

IsSynchronized IsSynchronized IsSynchronized IsSynchronized

获取一个值,该值指示是否同步对 ICollection 的访问(线程安全)。Gets a value indicating whether access to the ICollection is synchronized (thread safe).

(Inherited from ICollection)
Item[Int32] Item[Int32] Item[Int32] Item[Int32]

获取或设置指定索引处的元素。Gets or sets the element at the specified index.

(Inherited from IList)
SortDirection SortDirection SortDirection SortDirection

获取排序的方向。Gets the direction of the sort.

SortProperty SortProperty SortProperty SortProperty

获取正在用于排序的 PropertyDescriptorGets the PropertyDescriptor that is being used for sorting.

SupportsChangeNotification SupportsChangeNotification SupportsChangeNotification SupportsChangeNotification

获取当列表更改或列表中的项更改时是否引发 ListChanged 事件。Gets whether a ListChanged event is raised when the list changes or an item in the list changes.

SupportsSearching SupportsSearching SupportsSearching SupportsSearching

获取列表是否支持使用 Find(PropertyDescriptor, Object) 方法进行搜索。Gets whether the list supports searching using the Find(PropertyDescriptor, Object) method.

SupportsSorting SupportsSorting SupportsSorting SupportsSorting

获取列表是否支持排序。Gets whether the list supports sorting.

SyncRoot SyncRoot SyncRoot SyncRoot

获取可用于同步对 ICollection 的访问的对象。Gets an object that can be used to synchronize access to the ICollection.

(Inherited from ICollection)

方法

Add(Object) Add(Object) Add(Object) Add(Object)

将某项添加到 IList 中。Adds an item to the IList.

(Inherited from IList)
AddIndex(PropertyDescriptor) AddIndex(PropertyDescriptor) AddIndex(PropertyDescriptor) AddIndex(PropertyDescriptor)

PropertyDescriptor 添加到用于搜索的索引。Adds the PropertyDescriptor to the indexes used for searching.

AddNew() AddNew() AddNew() AddNew()

将新项添加到列表。Adds a new item to the list.

ApplySort(PropertyDescriptor, ListSortDirection) ApplySort(PropertyDescriptor, ListSortDirection) ApplySort(PropertyDescriptor, ListSortDirection) ApplySort(PropertyDescriptor, ListSortDirection)

根据 PropertyDescriptorListSortDirection 对列表进行排序。Sorts the list based on a PropertyDescriptor and a ListSortDirection.

Clear() Clear() Clear() Clear()

IList 中移除所有项。Removes all items from the IList.

(Inherited from IList)
Contains(Object) Contains(Object) Contains(Object) Contains(Object)

确定 IList 是否包含特定值。Determines whether the IList contains a specific value.

(Inherited from IList)
CopyTo(Array, Int32) CopyTo(Array, Int32) CopyTo(Array, Int32) CopyTo(Array, Int32)

从特定的 ICollection 索引开始,将 Array 的元素复制到一个 Array 中。Copies the elements of the ICollection to an Array, starting at a particular Array index.

(Inherited from ICollection)
Find(PropertyDescriptor, Object) Find(PropertyDescriptor, Object) Find(PropertyDescriptor, Object) Find(PropertyDescriptor, Object)

返回具有给定 PropertyDescriptor 的行的索引。Returns the index of the row that has the given PropertyDescriptor.

GetEnumerator() GetEnumerator() GetEnumerator() GetEnumerator()

返回循环访问集合的枚举数。Returns an enumerator that iterates through a collection.

(Inherited from IEnumerable)
IndexOf(Object) IndexOf(Object) IndexOf(Object) IndexOf(Object)

确定 IList 中特定项的索引。Determines the index of a specific item in the IList.

(Inherited from IList)
Insert(Int32, Object) Insert(Int32, Object) Insert(Int32, Object) Insert(Int32, Object)

IList 中的指定索引处插入一个项。Inserts an item to the IList at the specified index.

(Inherited from IList)
Remove(Object) Remove(Object) Remove(Object) Remove(Object)

IList 中移除特定对象的第一个匹配项。Removes the first occurrence of a specific object from the IList.

(Inherited from IList)
RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32)

移除位于指定索引处的 IList 项。Removes the IList item at the specified index.

(Inherited from IList)
RemoveIndex(PropertyDescriptor) RemoveIndex(PropertyDescriptor) RemoveIndex(PropertyDescriptor) RemoveIndex(PropertyDescriptor)

PropertyDescriptor 从用于搜索的索引中移除。Removes the PropertyDescriptor from the indexes used for searching.

RemoveSort() RemoveSort() RemoveSort() RemoveSort()

使用 ApplySort(PropertyDescriptor, ListSortDirection) 移除任何已应用的排序。Removes any sort applied using ApplySort(PropertyDescriptor, ListSortDirection).

事件

ListChanged ListChanged ListChanged ListChanged

当列表更改或列表中的项更改时发生。Occurs when the list changes or an item in the list changes.

扩展方法

Cast<TResult>(IEnumerable) Cast<TResult>(IEnumerable) Cast<TResult>(IEnumerable) Cast<TResult>(IEnumerable)

IEnumerable 的元素强制转换为指定的类型。Casts the elements of an IEnumerable to the specified type.

OfType<TResult>(IEnumerable) OfType<TResult>(IEnumerable) OfType<TResult>(IEnumerable) OfType<TResult>(IEnumerable)

根据指定类型筛选 IEnumerable 的元素。Filters the elements of an IEnumerable based on a specified type.

AsParallel(IEnumerable) AsParallel(IEnumerable) AsParallel(IEnumerable) AsParallel(IEnumerable)

启用查询的并行化。Enables parallelization of a query.

AsQueryable(IEnumerable) AsQueryable(IEnumerable) AsQueryable(IEnumerable) AsQueryable(IEnumerable)

IEnumerable 转换为 IQueryableConverts an IEnumerable to an IQueryable.

适用于