Objektbindung in Visual Studio

 

Veröffentlicht: Juli 2016

Visual Studio bietet Entwurfszeittools für die Arbeit mit benutzerdefinierten Objekten (im Gegensatz zu anderen Datenquellen wie Entitäten, Datasets und Diensten) als Datenquelle in der Anwendung.

Objektanforderungen

Bei benutzerdefinierten Objekten besteht die einzige Voraussetzung für die Zusammenarbeit mit Datenentwurfstools in Visual Studio darin, dass das Objekt mindestens eine öffentliche Eigenschaft enthalten muss.

Im Allgemeinen erfordern benutzerdefinierte Objekte keine speziellen Schnittstellen, Konstruktoren oder Attribute, um als Datenquelle für eine Anwendung zu fungieren. Wenn Sie jedoch das Objekt vom Datenquellenfenster auf eine Entwurfsoberfläche ziehen möchten, um ein datengebundenes Steuerelement zu erstellen, und wenn das Objekt die ITypedList-Schnittstelle oder die IListSource-Schnittstelle implementiert, muss das Objekt über einen Standardkonstruktor verfügen (das heißt, einen parameterlosen Konstruktor). Andernfalls kann Visual Studio das Datenquellenobjekt nicht instanziieren, und es wird ein Fehler angezeigt, wenn Sie das Element auf die Entwurfsoberfläche ziehen.

Beispiele der Verwendung von benutzerdefinierten Objekte als Datenquellen

Beim Arbeiten mit Objekten als Datenquelle bestehen unzählige Möglichkeiten zum Implementieren der Anwendungslogik. Es gibt jedoch einige Standardvorgänge, die mit den von Visual Studio generierten TableAdapter-Objekten vereinfacht werden können. Auf dieser Seite wird die Implementierung dieser Standardvorgänge mithilfe von TableAdapters beschrieben. Die Erläuterungen dienen jedoch nicht als Leitfaden zum Erstellen benutzerdefinierter Projekte. So werden z. B. unabhängig von der jeweiligen Implementierung Ihrer Objekte oder der Anwendungslogik im Normalfall die folgenden Standardvorgänge ausgeführt:

  • Laden von Daten in Objekte (i. d. R. aus einer Datenbank)

  • Erstellen einer typisierten Auflistung von Objekten

  • Hinzufügen von Objekten zu einer Auflistung und Entfernen der Objekte

  • Anzeigen der Objektdaten für Benutzer in einem Formular

  • Ändern bzw. Bearbeiten der in einem Objekt enthaltenen Daten

  • Speichern der in einem Objekt enthaltenen Daten in die Datenbank

Hinweis

Um ein besseres Verständnis zu erzielen und einen Hintergrund zu den Beispielen auf dieser Seite zu erhalten, sollten Sie folgende exemplarische Vorgehensweise durcharbeiten: Exemplarische Vorgehensweise: Herstellen einer Verbindung mit Daten in Objekten (Windows Forms). In dieser exemplarischen Vorgehensweise werden die auf dieser Hilfeseite erläuterten Objekte erstellt.

Laden von Daten in Objekte

In diesem Beispiel laden Sie mit TableAdapters Daten in die Objekte. TableAdapters werden standardmäßig mit zwei Arten von Methoden erstellt, die Daten aus einer Datenbank abrufen und Datentabellen auffüllen.

  • Die TableAdapter.Fill-Methode füllt eine vorhandene Datentabelle mit den zurückgegebenen Daten auf.

  • Die TableAdapter.GetData-Methode gibt eine neue, mit Daten aufgefüllte Datentabelle zurück.

Der einfachste Weg zum Laden von Daten in die benutzerdefinierten Objekte besteht darin, die TableAdapter.GetData-Methode aufzurufen, die Zeilenauflistung in der zurückgegebenen Datentabelle zu durchlaufen und jedes Objekt mit den Werten in der jeweiligen Zeile aufzufüllen. Sie können eine GetData-Methode erstellen, die für alle einem TableAdapter hinzugefügten Abfragen eine aufgefüllte Datentabelle zurückgibt.

Hinweis

In Visual Studio werden die TableAdapter-Abfragen standardmäßig mit Fill und GetData bezeichnet, die Namen können jedoch durch einen beliebigen gültigen Methodennamen ersetzt werden.

Im folgenden Beispiel wird gezeigt, wie Sie die Zeilen in einer Datentabelle durchlaufen und ein Objekt mit Daten auffüllen:

Ein vollständiges Codebeispiel finden Sie unter Exemplarische Vorgehensweise: Herstellen einer Verbindung mit Daten in Objekten (Windows Forms).

        private void LoadCustomers()
        {
            NorthwindDataSet.CustomersDataTable customerData = 
                customersTableAdapter1.GetTop5Customers();
            
            foreach (NorthwindDataSet.CustomersRow customerRow in customerData)
            {
                Customer currentCustomer = new Customer();
                currentCustomer.CustomerID = customerRow.CustomerID;
                currentCustomer.CompanyName = customerRow.CompanyName;

                if (customerRow.IsAddressNull() == false)
                {
                    currentCustomer.Address = customerRow.Address;
                }

                if (customerRow.IsCityNull() == false)
                {
                    currentCustomer.City = customerRow.City;
                }

                if (customerRow.IsContactNameNull() == false)
                {
                    currentCustomer.ContactName = customerRow.ContactName;
                }

                if (customerRow.IsContactTitleNull() == false)
                {
                    currentCustomer.ContactTitle = customerRow.ContactTitle;
                }

                if (customerRow.IsCountryNull() == false)
                {
                    currentCustomer.Country = customerRow.Country;
                }

                if (customerRow.IsFaxNull() == false)
                {
                    currentCustomer.Fax = customerRow.Fax;
                }

                if (customerRow.IsPhoneNull() == false)
                {
                    currentCustomer.Phone = customerRow.Phone;
                }

                if (customerRow.IsPostalCodeNull() == false)
                {
                    currentCustomer.PostalCode = customerRow.PostalCode;
                }

                if (customerRow.IsRegionNull() == false)
                {
                    currentCustomer.Region = customerRow.Region;
                }

                LoadOrders(currentCustomer);
                customerBindingSource.Add(currentCustomer);
            }
        }
    Private Sub LoadCustomers()
        Dim customerData As NorthwindDataSet.CustomersDataTable =
            CustomersTableAdapter1.GetTop5Customers()

        Dim customerRow As NorthwindDataSet.CustomersRow

        For Each customerRow In customerData
            Dim currentCustomer As New Customer()
            With currentCustomer

                .CustomerID = customerRow.CustomerID
                .CompanyName = customerRow.CompanyName

                If Not customerRow.IsAddressNull Then
                    .Address = customerRow.Address
                End If

                If Not customerRow.IsCityNull Then
                    .City = customerRow.City
                End If

                If Not customerRow.IsContactNameNull Then
                    .ContactName = customerRow.ContactName
                End If

                If Not customerRow.IsContactTitleNull Then
                    .ContactTitle = customerRow.ContactTitle
                End If

                If Not customerRow.IsCountryNull Then
                    .Country = customerRow.Country
                End If

                If Not customerRow.IsFaxNull Then
                    .Fax = customerRow.Fax
                End If

                If Not customerRow.IsPhoneNull Then
                    .Phone = customerRow.Phone
                End If

                If Not customerRow.IsPostalCodeNull Then
                    .PostalCode = customerRow.PostalCode
                End If

                If Not customerRow.Is_RegionNull Then
                    .Region = customerRow._Region
                End If

            End With

            LoadOrders(currentCustomer)
            CustomerBindingSource.Add(currentCustomer)
        Next
    End Sub

Erstellen einer typisierten Auflistung von Objekten

Sie können für die Objekte Auflistungsklassen erstellen oder die typisierten Auflistungen verwenden, die automatisch über die BindingSource-Komponente bereitgestellt werden.

Für das Erstellen einer benutzerdefinierten Auflistungsklasse wird empfohlen, von BindingList<T> zu erben. Diese generische Klasse stellt Funktionen zum Verwalten der Auflistung sowie die Möglichkeit bereit, Ereignisse auszulösen, die Benachrichtigungen an die Datenbindungsinfrastruktur in Windows Forms senden.

Die automatisch generierte Auflistung in BindingSource verwendet eine BindingList<T>-Klasse für die typisierte Auflistung. Wenn die Anwendung keine zusätzlichen Funktionen erfordert, können Sie die Auflistung innerhalb von BindingSource beibehalten. Weitere Informationen finden Sie unter der List-Eigenschaft der BindingSource-Klasse.

Hinweis

Wenn die Auflistung Funktionen erfordert, die von der Basisimplementierung der BindingList<T>-Klasse nicht bereitgestellt werden, müssen Sie eine benutzerdefinierte Auflistung erstellen, um der Klasse nach Bedarf Funktionen hinzufügen zu können.

Der folgende Code zeigt, wie die Klasse für eine stark typisierte Auflistung von Order-Objekten erstellt wird:

    /// <summary>
    /// A collection of Orders
    /// </summary>
    public class Orders: System.ComponentModel.BindingList<Order>
    {
        // Add any additional functionality required by your collection.
    }
    ''' <summary>
    ''' A collection of Orders
    ''' </summary>
    Public Class Orders
        Inherits System.ComponentModel.BindingList(Of Order)

        ' Add any additional functionality required by your collection.

    End Class

Hinzufügen von Objekten zu einer Auflistung

Das Hinzufügen von Objekten zu einer Auflistung erfolgt durch den Aufruf der Add-Methode der benutzerdefinierten Auflistungsklasse oder der BindingSource.

Ein Beispiel für das Hinzufügen zu einer Auflistung mithilfe einer BindingSource finden Sie unter der LoadCustomers-Methode unter Exemplarische Vorgehensweise: Herstellen einer Verbindung mit Daten in Objekten (Windows Forms).

Ein Beispiel für das Hinzufügen von Objekten zu einer benutzerdefinierten Auflistung finden Sie unter der LoadOrders-Methode unter Exemplarische Vorgehensweise: Herstellen einer Verbindung mit Daten in Objekten (Windows Forms).

Hinweis

Beim Erben von BindingList<T> wird automatisch eine Add-Methode für die benutzerdefinierte Auflistung bereitgestellt.

Der folgende Code zeigt, wie der typisierten Auflistung in einer BindingSource Objekte hinzugefügt werden:

            Customer currentCustomer = new Customer();
            customerBindingSource.Add(currentCustomer);
        Dim currentCustomer As New Customer()
        CustomerBindingSource.Add(currentCustomer)

Der folgende Code zeigt, wie einer typisierten Auflistung Objekte hinzugefügt werden, die von BindingList<T> erbt:

Hinweis

In diesem Beispiel ist die Orders-Auflistung eine Eigenschaft des Customer-Objekts.

            Order currentOrder = new Order();
            currentCustomer.Orders.Add(currentOrder);
        Dim currentOrder As New Order()
        currentCustomer.Orders.Add(currentOrder)

Entfernen von Objekten aus einer Auflistung

Das Entfernen von Objekten aus einer Auflistung erfolgt durch den Aufruf der Remove-Methode oder der RemoveAt-Methode der benutzerdefinierten Auflistungsklasse oder der BindingSource.

Hinweis

Beim Erben von BindingList<T> werden automatisch eine Remove-Methode und eine RemoveAt-Methode für die benutzerdefinierte Auflistung bereitgestellt.

Der folgende Code zeigt, wie Objekte in einer BindingSource gefunden und mithilfe der RemoveAt-Methode entfernt werden:

            int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
            customerBindingSource.RemoveAt(customerIndex);
        Dim customerIndex As Integer = CustomerBindingSource.Find("CustomerID", "ALFKI")
        CustomerBindingSource.RemoveAt(customerIndex)

Anzeigen von Objektdaten für Benutzer

Um Benutzern die in Objekten enthaltenen Daten anzuzeigen, erstellen Sie mit dem Assistent zum Konfigurieren von Datenquellen eine Objektdatenquelle und ziehen anschließend das gesamte Objekt oder einzelne Eigenschaften aus dem Datenquellenfenster in das Formular.

Weitere Informationen zum Erstellen einer Objektdatenquelle finden Sie unter Gewusst wie: Herstellen einer Verbindung mit Daten in Objekten.

Weitere Informationen zum Anzeigen der in Objekten enthaltenen Daten in Windows Forms finden Sie unter Binden von Steuerelementen an Daten in Visual Studio.

Ändern der in Objekten enthaltenen Daten

Bearbeiten Sie in benutzerdefinierten Objekten enthaltene Daten, die an Windows Forms-Steuerelemente gebunden sind, einfach im gebundenen Steuerelement (oder direkt in den Eigenschaften des Objekts). Über die Datenbindungsarchitektur werden die Daten im Objekt aktualisiert.

Wenn die Anwendung das Verfolgen von Änderungen und das Rückgängigmachen vorgesehener Änderungen zur Wiederherstellung der ursprünglichen Werte erfordert, müssen Sie diese Funktionalität in Ihrem Objektmodell implementieren. Beispiele dazu, wie Datentabellen vorgesehene Änderungen verfolgen, finden Sie unter DataRowState, HasChanges und unter GetChanges.

Zurückspeichern der in Objekten enthaltenen Daten in die Datenbank

Sie können Daten in die Datenbank zurückspeichern, indem Sie die im Objekt enthaltenen Werte an die DBDirect-Methoden des TableAdapter übergeben.

Visual Studio erstellt DBDirect-Methoden, die direkt an der Datenbank ausgeführt werden können. Für diese Methoden ist kein DataSet-Objekt oder DataTable-Objekt erforderlich.

TableAdapter-DBDirect-Methode Beschreibung
TableAdapter.Insert Fügt einer Datenbank neue Datensätze hinzu, und ermöglicht die Übergabe einzelner Spaltenwerte als Methodenparameter.
TableAdapter.Update Aktualisiert vorhandene Datensätze in einer Datenbank. Die Update-Methode übernimmt die Werte der ursprünglichen und der neuen Spalte als Methodenparameter. Anhand der ursprünglichen Werte wird der ursprüngliche Datensatz gefunden. Mit den neuen Werten wird dieser Datensatz anschließend aktualisiert.

Mit der TableAdapter.Update-Methode werden auch Änderungen in einem Dataset abgeglichen, das an die Datenbank zurückgesendet wird. Dazu wird DataSet, DataTable, DataRow oder ein Array aus DataRows als Methodenparameter verwendet.
TableAdapter.Delete Löscht vorhandene Datensätze aus der Datenbank basierend auf den ursprünglichen Spaltenwerten, die als Methodenparameter übergeben werden.

Um Daten aus einer Auflistung von Objekten zu speichern, durchlaufen Sie die Auflistung (z. B. mit einer for-next-Schleife), und übertragen Sie die Werte der einzelnen Objekte mithilfe der DBDirect-Methode des TableAdapter in die Datenbank.

Im folgenden Beispiel wird gezeigt, wie ein neuer Kunde mithilfe der TableAdapter.Insert-DBDirect-Methode direkt der Datenbank hinzugefügt wird:

        private void AddNewCustomers(Customer currentCustomer)
        {
            customersTableAdapter.Insert( 
                currentCustomer.CustomerID, 
                currentCustomer.CompanyName, 
                currentCustomer.ContactName, 
                currentCustomer.ContactTitle, 
                currentCustomer.Address, 
                currentCustomer.City, 
                currentCustomer.Region, 
                currentCustomer.PostalCode, 
                currentCustomer.Country, 
                currentCustomer.Phone, 
                currentCustomer.Fax);
        }
    Private Sub AddNewCustomer(ByVal currentCustomer As Customer)

        CustomersTableAdapter.Insert(
            currentCustomer.CustomerID,
            currentCustomer.CompanyName,
            currentCustomer.ContactName,
            currentCustomer.ContactTitle,
            currentCustomer.Address,
            currentCustomer.City,
            currentCustomer.Region,
            currentCustomer.PostalCode,
            currentCustomer.Country,
            currentCustomer.Phone,
            currentCustomer.Fax)
    End Sub

Siehe auch

Gewusst wie: Herstellen einer Verbindung mit Daten in Objekten
Exemplarische Vorgehensweise: Herstellen einer Verbindung mit Daten in Objekten (Windows Forms)
Gewusst wie: Speichern von Daten aus einem Objekt in einer Datenbank
Gewusst wie: Direktes Zugreifen auf die Datenbank mit einem TableAdapter
Exemplarische Vorgehensweise: Speichern von Daten mit den TableAdapter-DBDirect-Methoden
Binden von Steuerelementen an Daten in Visual Studio
TableAdapters
Speichern von Daten