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 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; } }
Available since 1.1


