IBindingList Interface
Provides the features required to support both complex and simple scenarios when binding to a data source.
Assembly: System (in System.dll)
| Name | Description | |
|---|---|---|
![]() | AllowEdit | Gets whether you can update items in the list. |
![]() | AllowNew | Gets whether you can add items to the list using AddNew. |
![]() | AllowRemove | |
![]() | Count | Gets the number of elements contained in the ICollection.(Inherited from ICollection.) |
![]() | IsFixedSize | |
![]() | IsReadOnly | |
![]() | IsSorted | Gets whether the items in the list are sorted. |
![]() | IsSynchronized | Gets a value indicating whether access to the ICollection is synchronized (thread safe).(Inherited from ICollection.) |
![]() | Item[Int32] | Gets or sets the element at the specified index.(Inherited from IList.) |
![]() | SortDirection | Gets the direction of the sort. |
![]() | SortProperty | Gets the PropertyDescriptor that is being used for sorting. |
![]() | SupportsChangeNotification | Gets whether a ListChanged event is raised when the list changes or an item in the list changes. |
![]() | SupportsSearching | Gets whether the list supports searching using the Find method. |
![]() | SupportsSorting | Gets whether the list supports sorting. |
![]() | SyncRoot | Gets an object that can be used to synchronize access to the ICollection.(Inherited from ICollection.) |
| Name | Description | |
|---|---|---|
![]() | Add(Object^) | |
![]() | AddIndex(PropertyDescriptor^) | Adds the PropertyDescriptor to the indexes used for searching. |
![]() | AddNew() | Adds a new item to the list. |
![]() | ApplySort(PropertyDescriptor^, ListSortDirection) | Sorts the list based on a PropertyDescriptor and a ListSortDirection. |
![]() | Clear() | |
![]() | Contains(Object^) | |
![]() | CopyTo(Array^, Int32) | Copies the elements of the ICollection to an Array, starting at a particular Array index.(Inherited from ICollection.) |
![]() | Find(PropertyDescriptor^, Object^) | Returns the index of the row that has the given PropertyDescriptor. |
![]() | GetEnumerator() | Returns an enumerator that iterates through a collection.(Inherited from IEnumerable.) |
![]() | IndexOf(Object^) | |
![]() | Insert(Int32, Object^) | |
![]() | Remove(Object^) | |
![]() | RemoveAt(Int32) | |
![]() | RemoveIndex(PropertyDescriptor^) | Removes the PropertyDescriptor from the indexes used for searching. |
![]() | RemoveSort() | Removes any sort applied using ApplySort. |
| Name | Description | |
|---|---|---|
![]() | ListChanged | Occurs when the list changes or an item in the list changes. |
| Name | Description | |
|---|---|---|
![]() | AsParallel() | Overloaded. Enables parallelization of a query.(Defined by ParallelEnumerable.) |
![]() | AsQueryable() | Overloaded. Converts an IEnumerable to an IQueryable.(Defined by Queryable.) |
![]() | Cast<TResult>() | Casts the elements of an IEnumerable to the specified type.(Defined by Enumerable.) |
![]() | OfType<TResult>() | Filters the elements of an IEnumerable based on a specified type.(Defined by Enumerable.) |
This interface is implemented by the DataView class. Implementation of a method should exhibit the same behavior as the implementation of that method in the DataView class.
When you call the ApplySort or RemoveSort methods, you should raise a ListChanged event with the Reset enumeration.
When you call the AddNew method, you should raise a ListChanged event with the ItemAdded enumeration carrying the appropriate index. The added row is in a state where pressing the ESC on a DataGridView control can remove the new row. Raising 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.
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.
The following example provides a simple implementation of the IBindingList interface. The CustomerList class stores customer information in a list. 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 ) ); } };
Available since 1.1


