IBindingList Interface

 

Provides the features required to support both complex and simple scenarios when binding to a data source.

Namespace:   System.ComponentModel
Assembly:  System (in System.dll)

public interface class IBindingList : IList, ICollection, IEnumerable

NameDescription
System_CAPS_pubpropertyAllowEdit

Gets whether you can update items in the list.

System_CAPS_pubpropertyAllowNew

Gets whether you can add items to the list using AddNew.

System_CAPS_pubpropertyAllowRemove

Gets whether you can remove items from the list, using Remove or RemoveAt.

System_CAPS_pubpropertyCount

Gets the number of elements contained in the ICollection.(Inherited from ICollection.)

System_CAPS_pubpropertyIsFixedSize

Gets a value indicating whether the IList has a fixed size.(Inherited from IList.)

System_CAPS_pubpropertyIsReadOnly

Gets a value indicating whether the IList is read-only.(Inherited from IList.)

System_CAPS_pubpropertyIsSorted

Gets whether the items in the list are sorted.

System_CAPS_pubpropertyIsSynchronized

Gets a value indicating whether access to the ICollection is synchronized (thread safe).(Inherited from ICollection.)

System_CAPS_pubpropertyItem[Int32]

Gets or sets the element at the specified index.(Inherited from IList.)

System_CAPS_pubpropertySortDirection

Gets the direction of the sort.

System_CAPS_pubpropertySortProperty

Gets the PropertyDescriptor that is being used for sorting.

System_CAPS_pubpropertySupportsChangeNotification

Gets whether a ListChanged event is raised when the list changes or an item in the list changes.

System_CAPS_pubpropertySupportsSearching

Gets whether the list supports searching using the Find method.

System_CAPS_pubpropertySupportsSorting

Gets whether the list supports sorting.

System_CAPS_pubpropertySyncRoot

Gets an object that can be used to synchronize access to the ICollection.(Inherited from ICollection.)

NameDescription
System_CAPS_pubmethodAdd(Object^)

Adds an item to the IList.(Inherited from IList.)

System_CAPS_pubmethodAddIndex(PropertyDescriptor^)

Adds the PropertyDescriptor to the indexes used for searching.

System_CAPS_pubmethodAddNew()

Adds a new item to the list.

System_CAPS_pubmethodApplySort(PropertyDescriptor^, ListSortDirection)

Sorts the list based on a PropertyDescriptor and a ListSortDirection.

System_CAPS_pubmethodClear()

Removes all items from the IList.(Inherited from IList.)

System_CAPS_pubmethodContains(Object^)

Determines whether the IList contains a specific value.(Inherited from IList.)

System_CAPS_pubmethodCopyTo(Array^, Int32)

Copies the elements of the ICollection to an Array, starting at a particular Array index.(Inherited from ICollection.)

System_CAPS_pubmethodFind(PropertyDescriptor^, Object^)

Returns the index of the row that has the given PropertyDescriptor.

System_CAPS_pubmethodGetEnumerator()

Returns an enumerator that iterates through a collection.(Inherited from IEnumerable.)

System_CAPS_pubmethodIndexOf(Object^)

Determines the index of a specific item in the IList.(Inherited from IList.)

System_CAPS_pubmethodInsert(Int32, Object^)

Inserts an item to the IList at the specified index.(Inherited from IList.)

System_CAPS_pubmethodRemove(Object^)

Removes the first occurrence of a specific object from the IList.(Inherited from IList.)

System_CAPS_pubmethodRemoveAt(Int32)

Removes the IList item at the specified index.(Inherited from IList.)

System_CAPS_pubmethodRemoveIndex(PropertyDescriptor^)

Removes the PropertyDescriptor from the indexes used for searching.

System_CAPS_pubmethodRemoveSort()

Removes any sort applied using ApplySort.

NameDescription
System_CAPS_pubeventListChanged

Occurs when the list changes or an item in the list changes.

NameDescription
System_CAPS_pubmethodAsParallel()

Overloaded. Enables parallelization of a query.(Defined by ParallelEnumerable.)

System_CAPS_pubmethodAsQueryable()

Overloaded. Converts an IEnumerable to an IQueryable.(Defined by Queryable.)

System_CAPS_pubmethodCast<TResult>()

Casts the elements of an IEnumerable to the specified type.(Defined by Enumerable.)

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

};

.NET Framework
Available since 1.1
Return to top
Show: