Auf Datenbindung bezogene Schnittstellen

Aktualisiert: November 2007

Mit ADO.NET können Sie viele verschiedene Datenstrukturen erstellen, um den Bindungsanforderungen der Anwendung sowie der Daten, mit denen Sie arbeiten, gerecht zu werden. Möglicherweise möchten Sie eigene Klassen erstellen, die Daten in Windows Forms bereitstellen oder konsumieren. Diese Objekte können unterschiedliche Funktionalitäts- und Komplexitätsstufen bieten. Dazu gehören z. B. die einfache Datenbindung, die Bereitstellung von Unterstützung zur Entwurfszeit, die Fehlerprüfung, die Änderungsbenachrichtigung und sogar die Unterstützung eines strukturierten Rollbacks der an den Daten selbst vorgenommenen Änderungen.

Consumer von Datenbindungsschnittstellen

In den folgenden Abschnitten werden zwei Gruppen von Schnittstellenobjekten beschrieben. In der ersten Gruppe sind Schnittstellen aufgeführt, die von Datenquellenautoren für Datenquellen implementiert werden. Diese Schnittstellen sollen von Datenquellenconsumern konsumiert werden, bei denen es sich in den meisten Fällen um Windows Forms-Steuerelemente oder -Komponenten handelt. In der zweiten Gruppe sind Schnittstellen aufgelistet, die für die Verwendung durch Komponentenautoren vorgesehen sind. Komponentenautoren verwenden diese Schnittstellen zum Erstellen von Komponenten, die die Datenbindung unterstützen, die vom Windows Forms-Datenbindungsmodul konsumiert werden soll. Sie können diese Schnittstellen innerhalb der mit dem Formular verknüpften Klassen implementieren, um die Datenbindung zu ermöglichen. Dabei entsteht immer eine Klasse, durch die eine Schnittstelle implementiert wird, die die Interaktion mit Daten ermöglicht. Die Datenentwurfstools zur schnellen Anwendungsentwicklung (RAD, Rapid Application Development) von Visual Studio nutzen bereits die Vorteile dieser Funktionen.

Weitere Informationen zum Implementieren von Schnittstellen finden Sie unter Implements-Schlüsselwort und Implements-Anweisung (Visual Basic) oder interface (C#-Referenz) (C#-Schlüsselwort).

Schnittstellen für die Implementierung durch Datenquellenautoren

Die folgenden Schnittstellen sind für die Konsumierung durch Windows Forms-Steuerelemente vorgesehen:

  • IList-Schnittstelle

    Eine Klasse, die die IList-Schnittstelle implementiert, könnte eine der Klassen Array, ArrayList oder CollectionBase sein. Dies sind indizierte Listen mit Elementen des Typs Object. Diese Listen müssen homogene Typen enthalten, da der Typ durch das erste Element des Indizes festgelegt wird. IList ist nur für die Bindung zur Laufzeit verfügbar.

    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> in Betracht ziehen. BindingList<T> ist eine erweiterbare Klasse, durch die die primären Schnittstellen implementiert werden, die für die bidirektionale Datenbindung von Windows Forms erforderlich sind.

  • IBindingList-Schnittstelle

    Eine Klasse, die die IBindingList-Schnittstelle implementiert, verfügt über weitaus umfassendere Datenbindungsfunktionen. Durch diese Implementierung stehen Ihnen für den Fall einer Änderung der Listenelemente (z. B. wenn sich das Feld Adresse für das dritte Element der Kundenliste ändert) oder einer Änderung der Liste (z. B. wenn sich die Anzahl der Elemente in der Liste erhöht oder verringert) grundlegende Sortierfunktionen und die Änderungsbenachrichtigung zur Verfügung. Die Änderungsbenachrichtigung ist wichtig, wenn mehrere Steuerelemente an dieselben Daten gebunden werden sollen, und falls Sie Datenänderungen, die in einem der Steuerelemente vorgenommen wurden, an die anderen gebundenen Steuerelemente weitergeben möchten.

    Hinweis:

    Die Änderungsbenachrichtigung für die IBindingList-Schnittstelle wird über die SupportsChangeNotification-Eigenschaft aktiviert. Wenn diese true ist, wird ein ListChanged-Ereignis ausgelöst, das angibt, dass sich die Liste oder ein Listenelement geändert hat.

    Die Art der Änderung wird mithilfe der ListChangedType-Eigenschaft des ListChangedEventArgs-Parameters beschrieben. Sobald das Datenmodell aktualisiert wird, werden folglich auch alle abhängigen Ansichten aktualisiert, z. B. andere, an dieselbe Datenquelle gebundene Steuerelemente. Die Objekte in der Liste müssen bei einer Änderung die Liste allerdings benachrichtigen, damit diese das ListChanged-Ereignis auslösen kann.

    Hinweis:

    Die BindingList<T>-Klasse stellt eine generische Implementierung der IBindingList-Schnittstelle bereit.

  • IBindingListView-Schnittstelle

    Eine Klasse, die die IBindingListView-Schnittstelle implementiert, stellt sämtliche Funktionen einer Implementierung von IBindingList und zusätzlich Funktionen für die Filterung und erweiterte Sortierung bereit. Diese Implementierung ermöglicht die zeichenfolgenbasierte Filterung und mehrspaltige Sortierung auf der Grundlage einer Kombination aus Eigenschaftendeskriptor und Sortierrichtung.

  • IEditableObject-Schnittstelle

    Über eine Klasse, die die IEditableObject-Schnittstelle implementiert, können Objekte steuern, wann an ihnen vorgenommene Änderungen permanent werden. Durch diese Implementierung stehen Ihnen die Methoden BeginEdit, EndEdit und CancelEdit zur Verfügung, mit deren Hilfe Sie ein Rollback der am Objekt vorgenommenen Änderungen ausführen können. Im Folgenden finden Sie eine kurze Erläuterung zur Funktionsweise der Methoden BeginEdit, EndEdit und CancelEdit sowie zum Zusammenwirken dieser Methoden, um ein Rollback der an den Daten vorgenommenen Änderungen zu ermöglichen:

    • Die BeginEdit-Methode signalisiert den Beginn der Bearbeitung eines Objekts. Objekte, die diese Schnittstelle implementieren, müssen alle nach Aufrufen der BeginEdit-Methode erfolgten Aktualisierungen so speichern, dass diese bei Aufrufen der CancelEdit-Methode verworfen werden können. Bei der Datenbindung in Windows Forms können Sie BeginEdit innerhalb des Gültigkeitsbereichs einer einzelnen Edit-Transaktion (z. B. BeginEdit, BeginEdit, EndEdit) mehrfach aufrufen. Implementierungen von IEditableObject sollten nachverfolgen, ob BeginEdit bereits aufgerufen wurde, und alle nachfolgenden Aufrufe an BeginEdit ignorieren. Da diese Methode mehrmals aufgerufen werden kann, muss gewährleistet sein, dass bei allen weiteren Versuchen, die Methode aufzurufen, kein Schaden entsteht, d. h., dass die vorgenommenen Aktualisierungen bei nachfolgenden BeginEdit-Aufrufen nicht beschädigt oder die beim ersten Aufruf von BeginEdit gespeicherten Daten nicht geändert werden.

    • Die EndEdit-Methode verschiebt die seit dem Aufruf von BeginEdit für das zugrunde liegende Objekt vorgenommenen Änderungen, wenn sich das Objekt im Bearbeitungsmodus befindet.

    • Die CancelEdit-Methode verwirft alle am Objekt vorgenommenen Änderungen.

    Weitere Informationen zur Funktionsweise der Methoden BeginEdit, EndEdit und CancelEdit finden Sie unter Übersicht über das Speichern von Daten.

    Dieser Transaktionsaspekt der Datenfunktionen wird vom DataGridView-Steuerelement verwendet.

  • ICancelAddNew-Schnittstelle

    Von einer Klasse, die die ICancelAddNew-Schnittstelle implementiert, wird normalerweise auch die IBindingList-Schnittstelle implementiert. Sie ermöglicht es Ihnen, mit der AddNew-Methode an der Datenquelle vorgenommene Änderungen zurückzusetzen. Wenn die Datenquelle die IBindingList-Schnittstelle implementiert, sollte sie auch die ICancelAddNew-Schnittstelle implementieren.

  • IDataErrorInfo-Schnittstelle

    Eine Klasse, die die IDataErrorInfo-Schnittstelle implementiert, ermöglicht es Objekten, gebundenen Steuerelementen benutzerdefinierte Fehlerinformationen zur Verfügung zu stellen:

    • Die Error-Eigenschaft gibt allgemeinen Fehlermeldungstext zurück (z. B. "Ein Fehler ist aufgetreten").

    • Die Item-Eigenschaft gibt eine Zeichenfolge mit der spezifischen Fehlermeldung aus der Spalte zurück (z. B. "Der Wert in der Spalte State ist ungültig").

  • IEnumerable-Schnittstelle

    Eine Klasse, die die IEnumerable-Schnittstelle implementiert, wird normalerweise von ASP.NET konsumiert. 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

    Über eine Auflistungsklasse, die die ITypedList-Schnittstelle implementiert, können die Reihenfolge und die für das gebundene Steuerelement verfügbar gemachte Gruppe von Eigenschaften gesteuert werden.

    Hinweis:

    Wenn Sie die GetItemProperties-Methode implementieren und das PropertyDescriptor-Array nicht NULL ist, entspricht der letzte Eintrag im Array dem Eigenschaftendeskriptor, durch den die List-Eigenschaft beschrieben wird, die wiederum eine andere Elementliste darstellt.

  • ICustomTypeDescriptor-Schnittstelle

    Eine Klasse, die die ICustomTypeDescriptor-Schnittstelle implementiert, stellt dynamische Informationen über sich selbst bereit. Diese Schnittstelle ist mit ITypedList vergleichbar, sie 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:

    Um die Bindung an Typen, die ICustomTypeDescriptor implementieren, zur Entwurfszeit zu unterstützen, muss der Typ außerdem IComponent implementieren und als Instanz im Formular vorhanden sein.

  • IListSource-Schnittstelle

    Durch eine Klasse, die die IListSource-Schnittstelle implementiert, wird die listenbasierte Bindung an Objekte aktiviert, die keine Liste darstellen. 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 zusätzlich die IBindingList-Schnittstelle implementiert. Über diese Schnittstelle wird angezeigt, ob der jeweilige Typ ListChanged-Ereignisse des Typs ItemChanged auslöst, indem er die zugehörige RaisesItemChangedEvents-Eigenschaft verwendet.

    Hinweis:

    Sie sollten IRaiseItemChangedEvents implementieren, wenn die Datenquelle die zuvor beschriebene Eigenschaft-zu-Listenereignis-Konvertierung bereitstellt und mit der BindingSource-Komponente interagiert. Andernfalls wird die Eigenschaft-zu-Listenereignis-Konvertierung auch von BindingSource ausgeführt, was die Leistung beeinträchtigt.

  • ISupportInitialize-Schnittstelle

    Eine Komponente, die die ISupportInitialize-Schnittstelle implementiert, nutzt die Vorteile von Batchoptimierungen, um Eigenschaften festzulegen und co-abhängige Eigenschaften zu initialisieren. ISupportInitialize enthält zwei Methoden:

    • BeginInit signalisiert, dass die Objektinitialisierung gestartet wird.

    • EndInit signalisiert, dass die Objektinitialisierung beendet wird.

  • ISupportInitializeNotification-Schnittstelle

    Durch eine Komponente, die die ISupportInitializeNotification-Schnittstelle implementiert, wird auch die ISupportInitialize-Schnittstelle implementiert. Diese Schnittstelle ermöglicht es Ihnen, andere ISupportInitialize-Komponenten darüber zu benachrichtigen, dass die Initialisierung abgeschlossen wurde. Die ISupportInitializeNotification-Schnittstelle enthält zwei Member:

  • INotifyPropertyChanged-Schnittstelle

    Eine Klasse, die diese Schnittstelle implementiert, ist ein Typ, der ein Ereignis auslöst, wenn sich einer der zugehörigen Eigenschaftenwerte ändert. Durch diese Schnittstelle wird die bisherige Praxis abgelöst, für jede Eigenschaft eines Steuerelements ein Change-Ereignis bereitzuhalten. Bei Verwendung in BindingList<T> sollte ein Geschäftsobjekt die INotifyPropertyChanged-Schnittstelle implementieren. PropertyChanged-Ereignisse werden von BindingList`1 in ListChanged-Ereignisse des Typs ItemChanged konvertiert.

    Hinweis:

    Damit in einer Bindung zwischen einem gebundenen Client und einer Datenquelle eine Änderungsbenachrichtigung stattfindet, sollte der Typ der gebundenen Datenquelle entweder die INotifyPropertyChanged-Schnittstelle implementieren (empfohlen), oder Sie stellen propertyNameChanged-Ereignisse für den gebundenen Typ zur Verfügung. Beide Verfahrensweisen sollten nicht gleichzeitig angewendet werden.

Schnittstellen für die Implementierung durch Komponentenautoren

Die folgenden Schnittstellen sind für die Konsumierung durch das Windows Forms-Datenbindungsmodul vorgesehen:

Siehe auch

Aufgaben

Gewusst wie: Erstellen eines einfach gebundenen Steuerelements in einem Windows Form

Konzepte

Datenbindung und Windows Forms

Weitere Ressourcen

Datenbindung in Web Forms