IBindingList Interface
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Biedt de functies die nodig zijn om zowel complexe als eenvoudige scenario's te ondersteunen bij het binden aan een gegevensbron.
public interface class IBindingList : System::Collections::IList
public interface IBindingList : System.Collections.IList
type IBindingList = interface
interface IList
interface ICollection
interface IEnumerable
type IBindingList = interface
interface ICollection
interface IEnumerable
interface IList
Public Interface IBindingList
Implements IList
- Afgeleid
- Implementeringen
Voorbeelden
Het volgende voorbeeld biedt een eenvoudige implementatie van de IBindingList interface. De CustomerList klasse slaat klantgegevens op in een lijst. In dit voorbeeld wordt ervan uitgegaan dat u de Customer klasse hebt gebruikt die u kunt vinden in het voorbeeld in de IEditableObject klasse.
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
{
readonly ListChangedEventArgs resetEvent = new(ListChangedType.Reset, -1);
ListChangedEventHandler onListChanged;
public void LoadCustomers()
{
IList l = this;
_ = l.Add(ReadCustomer1());
_ = l.Add(ReadCustomer2());
OnListChanged(resetEvent);
}
public Customer this[int index]
{
get => (Customer)List[index]; set => List[index] = value;
}
public int Add(Customer value) => List.Add(value);
public Customer AddNew() => (Customer)((IBindingList)this).AddNew();
public void Remove(Customer value) => List.Remove(value);
protected virtual void OnListChanged(ListChangedEventArgs ev) => onListChanged?.Invoke(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 => true;
bool IBindingList.AllowNew => true;
bool IBindingList.AllowRemove => true;
bool IBindingList.SupportsChangeNotification => true;
bool IBindingList.SupportsSearching => false;
bool IBindingList.SupportsSorting => false;
// Events.
public event ListChangedEventHandler ListChanged
{
add => onListChanged += value; remove => onListChanged -= value;
}
// Methods.
object IBindingList.AddNew()
{
Customer c = new(Count.ToString());
_ = List.Add(c);
return c;
}
// Unsupported properties.
bool IBindingList.IsSorted => throw new NotSupportedException();
ListSortDirection IBindingList.SortDirection => throw new NotSupportedException();
PropertyDescriptor IBindingList.SortProperty => 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.
static Customer ReadCustomer1() => new("536-45-1245")
{
FirstName = "Jo",
LastName = "Brown"
};
static Customer ReadCustomer2()
{
Customer cust = new("246-12-5645")
{
FirstName = "Robert",
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
Opmerkingen
Deze interface wordt geïmplementeerd door de DataView klasse. De implementatie van een methode moet hetzelfde gedrag vertonen als de implementatie van die methode in de DataView klasse.
Wanneer u de ApplySort of RemoveSort methoden aanroept, moet u een ListChanged gebeurtenis genereren met de Reset opsomming.
Wanneer u de AddNew methode aanroept, moet u een ListChanged gebeurtenis genereren met de ItemAdded opsomming die de juiste index bevat. De toegevoegde rij heeft een status waarbij u op Esc drukt op een DataGridView besturingselement de nieuwe rij kan verwijderen. Als u de ListChanged gebeurtenis met de ItemAdded opsomming een tweede keer op deze rij opgeeft, geeft u aan dat het item nu een rij is die niet de status 'nieuw' heeft.
Wanneer u een item verwijdert of de CancelEdit methode aanroept IEditableObjectop een nieuwe rij (als die rij wordt geïmplementeerd), moet u een ListChanged gebeurtenis genereren met de ItemDeleted opsomming die de juiste index bevat.
Eigenschappen
| Name | Description |
|---|---|
| AllowEdit |
Hiermee wordt aangegeven of u items in de lijst kunt bijwerken. |
| AllowNew |
Hiermee wordt aangegeven of u items aan de lijst kunt toevoegen met behulp van AddNew(). |
| AllowRemove |
Hiermee wordt opgehaald of u items uit de lijst kunt verwijderen met of Remove(Object)RemoveAt(Int32). |
| Count |
Hiermee haalt u het aantal elementen op dat is opgenomen in de ICollection. (Overgenomen van ICollection) |
| IsFixedSize |
Hiermee wordt een waarde opgehaald die aangeeft of de grootte van een IList vaste grootte is. (Overgenomen van IList) |
| IsReadOnly |
Hiermee wordt een waarde opgehaald die aangeeft of het IList kenmerk Alleen-lezen is. (Overgenomen van IList) |
| IsSorted |
Hiermee wordt opgehaald of de items in de lijst worden gesorteerd. |
| IsSynchronized |
Hiermee wordt een waarde opgehaald die aangeeft of de toegang tot de ICollection synchronisatie is gesynchroniseerd (thread safe). (Overgenomen van ICollection) |
| Item[Int32] |
Hiermee haalt u het element op de opgegeven index op of stelt u het in. (Overgenomen van IList) |
| SortDirection |
Hiermee haalt u de richting van het type op. |
| SortProperty |
Hiermee haalt u de PropertyDescriptor gegevens op die worden gebruikt voor sorteren. |
| SupportsChangeNotification |
Hiermee wordt aangegeven of er een ListChanged gebeurtenis wordt gegenereerd wanneer de lijst wordt gewijzigd of wanneer een item in de lijst wordt gewijzigd. |
| SupportsSearching |
Hiermee wordt aangegeven of de lijst ondersteuning biedt voor zoeken met behulp van de Find(PropertyDescriptor, Object) methode. |
| SupportsSorting |
Hiermee wordt aangegeven of de lijst sorteerbewerkingen ondersteunt. |
| SyncRoot |
Hiermee haalt u een object op dat kan worden gebruikt om de toegang tot het ICollectionobject te synchroniseren. (Overgenomen van ICollection) |
Methoden
| Name | Description |
|---|---|
| Add(Object) |
Voegt een item toe aan de IList. (Overgenomen van IList) |
| AddIndex(PropertyDescriptor) |
Voegt de PropertyDescriptor indexen toe die worden gebruikt voor het zoeken. |
| AddNew() |
Hiermee voegt u een nieuw item toe aan de lijst. |
| ApplySort(PropertyDescriptor, ListSortDirection) |
Hiermee sorteert u de lijst op basis van een PropertyDescriptor en een ListSortDirection. |
| Clear() |
Hiermee verwijdert u alle items uit de IList. (Overgenomen van IList) |
| Contains(Object) |
Bepaalt of de IList waarde een specifieke waarde bevat. (Overgenomen van IList) |
| CopyTo(Array, Int32) |
Kopieert de elementen van de ICollection elementen naar een Array, beginnend bij een bepaalde Array index. (Overgenomen van ICollection) |
| Find(PropertyDescriptor, Object) |
Retourneert de index van de rij met de opgegeven PropertyDescriptor. |
| GetEnumerator() |
Retourneert een enumerator die door een verzameling wordt herhaald. (Overgenomen van IEnumerable) |
| IndexOf(Object) |
Bepaalt de index van een specifiek item in de IList. (Overgenomen van IList) |
| Insert(Int32, Object) |
Hiermee voegt u een item toe aan de IList opgegeven index. (Overgenomen van IList) |
| Remove(Object) |
Hiermee verwijdert u het eerste exemplaar van een specifiek object uit de IList. (Overgenomen van IList) |
| RemoveAt(Int32) |
Hiermee verwijdert u het IList item in de opgegeven index. (Overgenomen van IList) |
| RemoveIndex(PropertyDescriptor) |
Hiermee verwijdert u de PropertyDescriptor indexen die worden gebruikt voor het zoeken. |
| RemoveSort() |
Hiermee verwijdert u alle toegepaste sorteringen met behulp van ApplySort(PropertyDescriptor, ListSortDirection). |
gebeurtenis
| Name | Description |
|---|---|
| ListChanged |
Treedt op wanneer de lijst wordt gewijzigd of een item in de lijst wordt gewijzigd. |
Extensiemethoden
| Name | Description |
|---|---|
| AsParallel(IEnumerable) |
Hiermee schakelt u parallelle uitvoering van een query in. |
| AsQueryable(IEnumerable) |
Converteert een IEnumerable naar een IQueryable. |
| Cast<TResult>(IEnumerable) |
Cast de elementen van een IEnumerable naar het opgegeven type. |
| OfType<TResult>(IEnumerable) |
Hiermee filtert u de elementen van een IEnumerable op basis van een opgegeven type. |