Objektbindung in Visual Studio
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
Tipp
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.
Tipp
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 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
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);
}
}
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.
Tipp
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
Inherits System.ComponentModel.BindingList(Of Order)
' Add any additional functionality required by your collection.
End Class
/// <summary>
/// A collection of Orders
/// </summary>
public class Orders: System.ComponentModel.BindingList<Order>
{
// Add any additional functionality required by your collection.
}
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).
Tipp
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:
Dim currentCustomer As New Customer()
CustomerBindingSource.Add(currentCustomer)
Customer currentCustomer = new Customer();
customerBindingSource.Add(currentCustomer);
Der folgende Code zeigt, wie einer typisierten Auflistung Objekte hinzugefügt werden, die von BindingList<T> erbt:
Tipp
In diesem Beispiel ist die Orders-Auflistung eine Eigenschaft des Customer-Objekts.
Dim currentOrder As New Order()
currentCustomer.Orders.Add(currentOrder)
Order currentOrder = 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.
Tipp
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:
Dim customerIndex As Integer = CustomerBindingSource.Find("CustomerID", "ALFKI")
CustomerBindingSource.RemoveAt(customerIndex)
int customerIndex = 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 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
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);
}
Siehe auch
Aufgaben
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
Konzepte
Binden von Steuerelementen an Daten in Visual Studio