Auf Datenbindung bezogene Schnittstellen
Mit ADO.NET können Sie viele verschiedene Datenstrukturen entsprechend den Bindungsanforderungen der Anwendung und der Daten erstellen, mit denen Sie arbeiten. Möglicherweise möchten Sie eigene Klassen erstellen, die Daten in Windows Forms bereitstellen oder verwenden. Diese Objekte können ein unterschiedliches Maß an Funktionalität und Komplexität bieten, von der Basisdatenbindung bis hin zur Bereitstellung der Unterstützung während der Entwurfszeit, Überprüfung von Fehlern, Benachrichtigung oder sogar Unterstützung für eine strukturierte Zurücksetzung der an den Daten selbst vorgenommenen Änderungen.
Consumer von Datenbindungsschnittstellen
In den folgenden Abschnitten werden zwei Gruppen von Benutzeroberflächenobjekten beschrieben. Die erste Gruppe sind die Schnittstellen, die von Datenquellenautoren für Datenquellen implementiert werden. Diese Schnittstellen sollen von Datenquellenconsumern genutzt werden, die in den meisten Fällen Windows Forms-Steuerelemente oder Komponenten sind. Die zweite Gruppe bilden die Schnittstellen, die für die Verwendung durch Komponentenautoren vorgesehen sind. Komponentenautoren verwenden diese Schnittstellen, wenn sie eine Komponente erstellen, die die von der Windows Forms-Datenbindungs-Engine zu nutzende Datenbindung unterstützt. Sie können diese Schnittstellen in Klassen im Zusammenhang mit dem Formular implementieren, um die Datenbindung zu aktivieren. Jeder Fall stellt eine Klasse dar, die eine Schnittstelle implementiert, die die Interaktion mit Daten ermöglicht. Visual Studio-Datenentwurfstools für die schnelle Anwendungsentwicklung (Rapid Application Development (RAD)) nutzen bereits die Vorteile dieser Funktionen.
Schnittstellen für die Implementierung von Datenquellenautoren
Die folgenden Schnittstellen sollen von Windows Forms-Steuerelementen genutzt werden:
IList-Schnittstelle
Eine Klasse, die die IList-Schnittstelle implementiert, kann ein Array-, ArrayList- oder CollectionBase-Objekt sein. Dies sind indizierte Listen mit Elementen des Typs Object. Diese Listen müssen homogene Typen enthalten, da das erste Element des Index den Typ bestimmt. IList steht nur zur Laufzeit für die Bindung zur Verfügung.
Hinweis
Wenn Sie eine Liste von Geschäftsobjekten für die Bindung mit Windows Forms erstellen möchten, sollten Sie die Verwendung von BindingList<T> erwägen. BindingList<T> ist eine erweiterbare-Klasse, die die primären Schnittstellen für die bidirektionale Windows Forms-Datenbindung implementiert.
IBindingList-Schnittstelle
Eine Klasse, die die IBindingList-Schnittstelle implementiert, bietet wesentlich anspruchsvollere Datenbindungsfunktionen. Diese Implementierung bietet Ihnen die grundlegenden Sortierfunktionen und Änderungsbenachrichtigung für Änderungen der Listenelemente (z.B. wenn das Feld Adresse des dritten Elements in einer Liste von Kunden geändert wurde) und für Änderungen der Liste selbst (z.B. wenn die Anzahl der Elemente in der Liste erhöht oder verringert wird). Änderungsbenachrichtigungen sind wichtig, wenn mehrere Steuerelemente an dieselben Daten gebunden und Datenänderungen in einem der Steuerelemente vorgenommen werden sollen, die an die anderen gebundenen Steuerelemente weitergegeben werden sollen.
Hinweis
Die Benachrichtigung über Änderungen wird für die IBindingList-Schnittstelle durch die Eigenschaft SupportsChangeNotification aktiviert. Ist diese auf ListChanged festgelegt, wird ein
true
-Ereignis ausgelöst, das anzeigt, dass sich die Liste oder ein Element in der Liste geändert hat.Der Änderungstyp wird durch die Eigenschaft ListChangedType des Parameters ListChangedEventArgs beschrieben. Wenn das Datenmodell aktualisiert wird, werden daher alle abhängigen Ansichten, wie z.B. andere Steuerelemente, die an die gleiche Datenquelle gebunden sind, ebenfalls aktualisiert. In der Liste enthaltene Objekte müssen die Liste jedoch benachrichtigen, wenn sie sich ändern, sodass die Liste das ListChanged-Ereignis auslösen kann.
Hinweis
Das BindingList<T>-Objekt stellt eine generische Implementierung der IBindingList-Schnittstelle bereit.
IBindingListView-Schnittstelle
Eine Klasse, die die IBindingListView-Schnittstelle implementiert, bietet alle Funktionen einer Implementierung von IBindingList sowie Filterung und erweiterte Sortierung. Diese Implementierung bietet zeichenfolgenbasierte Filterung und die mehrspaltige Sortierung mit Eigenschaftendeskriptor-Richtungspaaren.
IEditableObject-Schnittstelle
Eine Klasse, die die IEditableObject-Schnittstelle implementiert, ermöglicht es, ein Objekt zu steuern, wenn Änderungen an diesem Objekt festgelegt werden. Diese Implementierung bietet Ihnen die Methoden BeginEdit, EndEdit und CancelEdit, mit denen Sie Änderungen am Objekt rückgängig machen können. Nachfolgend wird die Funktionsweise der Methoden BeginEdit, EndEdit und CancelEdit kurz erläutert und erklärt, wie diese zusammenarbeiten, um das Zurücksetzen von Änderungen an den Daten zu ermöglichen:
Die Methode BeginEdit signalisiert den Start der Bearbeitung eines Objekts. Ein Objekt, das diese Schnittstelle implementiert, muss alle Updates nach dem BeginEdit-Methodenaufruf so speichern, dass die Updates verworfen werden können, falls die Methode CancelEdit aufgerufen wird. In der Windows Forms-Datenbindung können Sie BeginEdit mehrmals im Rahmen einer einzelnen Bearbeitungstransaktion aufrufen (z. B. BeginEdit, BeginEdit, EndEdit). Implementierungen von IEditableObject sollten verfolgen, ob BeginEdit bereits aufgerufen wurde, und nachfolgende Aufrufe von BeginEdit ignorieren. Da diese Methode mehrmals aufgerufen werden kann, ist es wichtig, dass nachfolgende Aufrufe nicht destruktiv sind; d.h. nachfolgende BeginEdit-Aufrufe können die Updates nicht zerstören, die vorgenommen wurden, bzw. die Daten nicht ändern, die beim ersten BeginEdit-Aufruf gespeichert wurden.
Die EndEdit-Methode überträgt alle Änderungen seit dem Aufruf von BeginEdit per Push in das zugrunde liegende Objekt, wenn sich das Objekt gerade im Bearbeitungsmodus befindet.
Mit der CancelEdit-Methode werden alle an am Objekt vorgenommenen Änderungen verworfen.
Weitere Informationen dazu, wie die Methoden BeginEdit, EndEdit und CancelEdit funktionieren, finden Sie unter Zurückspeichern von Daten in die Datenbank.
Dieser Transaktionsaspekt der Datenfunktionen wird vom DataGridView-Steuerelement verwendet.
ICancelAddNew-Schnittstelle
Eine Klasse, die die ICancelAddNew-Schnittstelle implementiert, implementiert normalerweise die IBindingList-Schnittstelle und ermöglicht Ihnen, eine Hinzufügung zur Datenquelle mit der AddNew-Methode rückgängig zu machen. Wenn die Datenquelle die IBindingList-Schnittstelle implementiert, sollten Sie sie auch die ICancelAddNew-Schnittstelle implementieren lassen.
IDataErrorInfo-Schnittstelle
Eine Klasse, die die IDataErrorInfo-Schnittstelle implementiert, ermöglicht es Objekten, benutzerdefinierte Fehlerinformationen zu gebundenen Steuerelementen anzubieten:
IEnumerable-Schnittstelle
Eine Klasse, die die IEnumerable-Schnittstelle implementiert, wird in der Regel von ASP.NET genutzt. Windows Forms-Unterstützung für diese Schnittstelle ist nur über die BindingSource-Komponente verfügbar.
Hinweis
Die BindingSource-Komponente kopiert alle IEnumerable-Elemente zu Bindungszwecken in eine separate Liste.
ITypedList-Schnittstelle
Eine Auflistungsklasse, die die ITypedList-Schnittstelle implementiert, bietet die Möglichkeit zum Steuern der Reihenfolge und Festlegen der Eigenschaften, die für das gebundene Steuerelement verfügbar gemacht werden.
Hinweis
Wenn Sie die Methode GetItemProperties implementieren und der Array PropertyDescriptor nicht NULL ist, wird der letzte Eintrag im Array der Eigenschaftendeskriptor, der die Listeneigenschaft beschreibt, die eine andere Liste von Elementen ist.
ICustomTypeDescriptor-Schnittstelle
Eine Klasse, die die ICustomTypeDescriptor-Schnittstelle implementiert, stellt dynamische Informationen über sich selbst bereit. Diese Schnittstelle ähnelt ITypedList, wird jedoch für Objekte und nicht für Listen verwendet. Diese Schnittstelle wird von DataRowView verwendet, um das Schema der zugrunde liegenden Zeilen zu projizieren. Eine einfache Implementierung von ICustomTypeDescriptor wird von der CustomTypeDescriptor-Klasse bereitgestellt.
Hinweis
Zur Unterstützung von Entwurfszeitbindung an Typen, die das ICustomTypeDescriptor-Objekt implementieren, muss der Typ auch IComponent implementieren und als Instanz im Formular vorhanden sein.
IListSource-Schnittstelle
Eine Klasse, die die IListSource-Schnittstelle implementiert, ermöglicht die listenbasierte Bindung auf Nichtlistenobjekten. Die GetList-Methode von IListSource wird verwendet, um eine bindbare Liste von einem Objekt zurückzugeben, das nicht von IList erbt. IListSource wird von der DataSet-Klasse verwendet.
IRaiseItemChangedEvents-Schnittstelle
Eine Klasse, die die IRaiseItemChangedEvents-Schnittstelle implementiert, ist eine bindbare Liste, die auch die IBindingList-Schnittstelle implementiert. Diese Schnittstelle wird verwendet, um anzuzeigen, ob Ihr Typ ListChanged-Ereignisse des Typs ItemChanged über seine RaisesItemChangedEvents-Eigenschaft auslöst.
Hinweis
Implementieren Sie das IRaiseItemChangedEvents-Objekt, wenn Ihre Datenquelle die Eigenschaft bereitstellt, die zuvor beschriebene Ereigniskonvertierung aufzulisten, und mit der BindingSource-Komponente interagiert. Andernfalls führt das BindingSource-Objekt auch die Eigenschaft zur Auflistung der Ereigniskonvertierung aus, wodurch sich die Leistung verschlechtert.
ISupportInitialize-Schnittstelle
Eine Komponente, die die ISupportInitialize-Schnittstelle implementiert, nutzt die Vorteile von Batchoptimierungen, um Eigenschaften festzulegen und Eigenschaften mit gegenseitigen Abhängigkeiten zu initialisieren. ISupportInitialize enthält zwei Methoden:
ISupportInitializeNotification-Schnittstelle
Eine Komponente, die die ISupportInitializeNotification-Schnittstelle implementiert, implementiert auch die ISupportInitialize-Schnittstelle. Diese Schnittstelle ermöglicht es Ihnen, andere ISupportInitialize-Komponenten darüber zu informieren, dass die Initialisierung abgeschlossen ist. Die Schnittstelle ISupportInitializeNotification enthält zwei Member:
IsInitialized gibt einen
boolean
-Wert zurück, der angibt, ob die Komponente initialisiert ist.Initialized tritt ein, wenn EndInit aufgerufen wird.
INotifyPropertyChanged-Schnittstelle
Eine Klasse, die diese Schnittstelle implementiert, ist ein Typ, der ein Ereignis auslöst, wenn sich einer der Eigenschaftswerte ändert. Diese Schnittstelle soll das Muster ersetzen, dass für jede Eigenschaft eines Steuerelements ein Änderungsereignis vorhanden ist. Bei Verwendung in einem BindingList<T>-Objekt sollte ein Geschäftsobjekt die INotifyPropertyChanged-Schnittstelle implementieren, und das BindingList1-Objekt konvertiert PropertyChanged-Ereignisse in ListChanged-Ereignisse des Typs ItemChanged.
Hinweis
Damit Änderungsbenachrichtigungen in einer Bindung zwischen einem gebundenen Client und einer Datenquelle auftreten, sollte der gebundene Datenquellentyp die INotifyPropertyChanged-Schnittstelle implementieren (bevorzugt), oder Sie können propertyName
Changed
-Ereignisse für den gebundenen Typ bereitstellen, sollten jedoch nicht beides tun.
Schnittstellen für die Implementierung von Komponentenautoren
Die folgenden Schnittstellen sind für die Nutzung durch die Windows Forms-Datenbindungs-Engine ausgelegt:
IBindableComponent-Schnittstelle
Eine Klasse, die diese Schnittstelle implementiert, ist eine Nichtsteuerungskomponente, die die Datenbindung unterstützt. Die Klasse gibt die Datenbindungen und den Bindungskontext der Komponente über die Eigenschaften DataBindings und BindingContext dieser Schnittstelle zurück.
Hinweis
Wenn Ihre Komponente von Control erbt, müssen Sie die IBindableComponent-Schnittstelle nicht implementieren.
ICurrencyManagerProvider-Schnittstelle
Eine Klasse, die die ICurrencyManagerProvider-Schnittstelle implementiert, ist eine Komponente, die ihr eigenes CurrencyManager-Objekt bereitstellt, um die dieser bestimmten Komponente zugeordneten Bindungen zu verwalten. Der Zugriff auf das benutzerdefinierte CurrencyManager-Objekt wird von der CurrencyManager-Eigenschaft bereitgestellt.
Hinweis
Da eine Klasse, die von Control erbt, Bindungen automatisch über ihre BindingContext-Eigenschaft verwaltet, sind Fälle, in denen Sie das ICurrencyManagerProvider-Objekt implementieren müssen, relativ selten.
Weitere Informationen
.NET Desktop feedback