Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Die DataSet Klassen und verwandten Klassen sind ältere .NET Framework-Technologien aus den frühen 2000er Jahren, mit denen Anwendungen mit Daten im Arbeitsspeicher arbeiten können, während die Apps von der Datenbank getrennt sind. Die Technologien sind besonders nützlich für Apps, mit denen Benutzer Daten ändern und die Änderungen wieder in der Datenbank speichern können. Obwohl Datasets eine bewährte erfolgreiche Technologie sind, ist der empfohlene Ansatz für neue .NET-Anwendungen die Verwendung von Entity Framework Core. Entity Framework bietet eine natürlichere Möglichkeit zum Arbeiten mit tabellarischen Daten als Objektmodelle und verfügt über eine einfachere Programmierschnittstelle.
Visual Studio bietet Entwurfszeittools zum Arbeiten mit benutzerdefinierten Objekten als Datenquelle in Ihrer Anwendung. Wenn Sie Daten aus einer Datenbank in einem Objekt speichern möchten, das Sie an UI-Steuerelemente binden, empfiehlt es sich, Entity Framework zum Generieren der Klasse oder Klassen zu verwenden. Entity Framework generiert automatisch den gesamten Code für die Änderungsnachverfolgung, was bedeutet, dass alle Änderungen an den lokalen Objekten automatisch in der Datenbank gespeichert werden, wenn Sie AcceptChanges für das DbSet-Objekt aufrufen. Weitere Informationen finden Sie in der Entity Framework-Dokumentation.
Tipp
Die Ansätze zur Objektbindung in diesem Artikel sollten nur berücksichtigt werden, wenn Ihre Anwendung bereits auf Datasets basiert. Sie können diese Ansätze auch verwenden, wenn Sie bereits mit Datasets vertraut sind, und die Daten, die Sie verarbeiten werden, tabellarisch und nicht zu komplex oder zu groß sind. Ein noch einfacheres Beispiel für das direkte Laden von Daten in Objekte mithilfe eines DataReader und das manuelle Aktualisieren der Benutzeroberfläche ohne Datenbindung finden Sie unter Erstellen einer einfachen Datenanwendung mithilfe von ADO.NET.
Objektanforderungen
Die einzige Anforderung für benutzerdefinierte Objekte für die Arbeit mit den Datenentwurfstools in Visual Studio besteht darin, dass das Objekt mindestens eine öffentliche Eigenschaft benötigt.
Im Allgemeinen erfordern benutzerdefinierte Objekte keine spezifischen Schnittstellen, Konstruktoren oder Attribute, die als Datenquelle für eine Anwendung fungieren sollen. Wenn Sie jedoch das Objekt aus dem Datenquellenfenster auf eine Entwurfsoberfläche ziehen möchten, um ein datengebundenes Steuerelement zu erstellen, und wenn das Objekt entweder die ITypedList- oder die IListSource-Schnittstelle implementiert, muss das Objekt über einen Standardkonstruktor verfügen. Andernfalls kann Visual Studio das Datenquellenobjekt nicht instanziieren und zeigt einen Fehler an, wenn Sie das Element auf die Entwurfsoberfläche ziehen.
Beispiele für die Verwendung von benutzerdefinierten Objekten als Datenquellen
Obwohl es unzählige Möglichkeiten gibt, Ihre Anwendungslogik beim Arbeiten mit Objekten als Datenquelle zu implementieren, gibt es für SQL-Datenbanken einige Standardvorgänge, die mithilfe der von Visual Studio generierten TableAdapter-Objekte vereinfacht werden können. Auf dieser Seite wird erläutert, wie diese Standardprozesse mithilfe von TableAdapters implementiert werden. Es ist nicht als Leitfaden zum Erstellen ihrer benutzerdefinierten Objekte gedacht. Beispielsweise führen Sie in der Regel die folgenden Standardvorgänge unabhängig von der spezifischen Implementierung Ihrer Objekte oder der Logik der Anwendung aus:
Laden von Daten in Objekte (in der Regel aus einer Datenbank).
Erstellen einer typierten Auflistung von Objekten.
Hinzufügen von Objekten zu und Entfernen von Objekten aus einer Auflistung.
Anzeigen der Objektdaten für Benutzer in einem Formular.
Ändern/Bearbeiten der Daten in einem Objekt.
Speichern von Daten aus Objekten in die Datenbank.
Laden von Daten in Objekte
In diesem Beispiel laden Sie Daten mithilfe von TableAdapters in Ihre Objekte. TableAdapters werden standardmäßig mit zwei Methodentypen erstellt, die Daten aus einer Datenbank abrufen und Datentabellen auffüllen.
Die
TableAdapter.FillMethode füllt eine vorhandene Datentabelle mit den zurückgegebenen Daten.Die
TableAdapter.GetDataMethode gibt eine neue Datentabelle zurück, die mit Daten gefüllt ist.
Die einfachste Möglichkeit zum Laden benutzerdefinierter Objekte mit Daten besteht darin, die TableAdapter.GetData Methode aufzurufen, die Auflistung von Zeilen in der zurückgegebenen Datentabelle zu durchlaufen und jedes Objekt mit den Werten in jeder Zeile aufzufüllen. Sie können eine GetData Methode erstellen, die eine aufgefüllte Datentabelle für jede Abfrage zurückgibt, die einem TableAdapter hinzugefügt wurde.
Hinweis
Visual Studio benennt die TableAdapter-Abfragen Fill und GetData standardmäßig, aber Sie können diese Namen in einen beliebigen gültigen Methodennamen ändern.
Das folgende Beispiel zeigt, wie die Zeilen in einer Datentabelle durchlaufen und ein Objekt mit Daten aufgefüllt wird:
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 typierten Auflistung von Objekten
Sie können Sammlungsklassen für Ihre Objekte erstellen oder die typierten Auflistungen verwenden, die automatisch von der BindingSource-Komponente bereitgestellt werden.
Wenn Sie eine benutzerdefinierte Sammlungsklasse für Objekte erstellen, wird empfohlen, dass Sie von BindingList<T> erben. Diese generische Klasse bietet Funktionen zum Verwalten Ihrer Sammlung sowie die Möglichkeit, Ereignisse auszuheben, die Benachrichtigungen an die Datenbindungsinfrastruktur in Windows Forms senden.
Die automatisch generierte Sammlung in der BindingSource verwendet eine BindingList<T> für die typisierte Sammlung. Wenn Ihre Anwendung keine zusätzlichen Funktionalitäten benötigt, können Sie Ihre Sammlung innerhalb des BindingSource-Containers verwalten. Weitere Informationen finden Sie in der List Eigenschaft der BindingSource Klasse.
Hinweis
Wenn Ihre Sammlung Funktionen erfordert, die nicht von der Basisimplementierung der BindingList<T>Sammlung bereitgestellt werden, sollten Sie eine benutzerdefinierte Sammlung erstellen, damit Sie die Klasse nach Bedarf hinzufügen können.
Der folgende Code zeigt, wie Sie die Klasse für eine stark typierte Auflistung von Order Objekten erstellen:
/// <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
Sie fügen einer Auflistung Objekte hinzu, indem Sie die Add-Methode Ihrer benutzerdefinierten Auflistungsklasse oder der BindingSource-Auflistungsklasse aufrufen.
Hinweis
Die Add-Methode wird automatisch für Ihre benutzerdefinierte Sammlung bereitgestellt, wenn Sie von BindingList<T> erben.
Der folgende Code zeigt, wie Sie der typisierten Sammlung in einer BindingSource Objekte hinzufügen:
Der folgende Code zeigt, wie Objekte zu einer typisierten Auflistung hinzugefügt werden können, die von BindingList<T> erbt.
Hinweis
In diesem Beispiel ist die Orders Auflistung eine Eigenschaft des Customer Objekts.
Entfernen von Objekten aus einer Auflistung
Sie entfernen Objekte aus einer Auflistung, indem Sie die Methode Remove oder RemoveAt Ihrer benutzerdefinierten Auflistungsklasse oder von BindingSource aufrufen.
Hinweis
Die Methoden Remove und RemoveAt werden automatisch für Ihre benutzerdefinierte Sammlung bereitgestellt, wenn Sie von BindingList<T>erben.
Der folgende Code zeigt, wie Objekte aus der typierten Auflistung in einer BindingSource mit der RemoveAt Methode gefunden und entfernt werden:
int customerIndex = customerBindingSource.Find("CustomerID", "ALFKI");
customerBindingSource.RemoveAt(customerIndex);
Anzeigen von Objektdaten für Benutzer
Um die Daten in Objekten für Benutzer anzuzeigen, erstellen Sie eine Objektdatenquelle mithilfe des Assistenten für die Datenquellenkonfiguration , und ziehen Sie dann das gesamte Objekt oder einzelne Eigenschaften aus dem Datenquellenfenster auf Ihr Formular.
Ändern der Daten in Objekten
Wenn Sie Daten in benutzerdefinierten Objekten bearbeiten möchten, die an Windows Forms-Steuerelemente gebunden sind, bearbeiten Sie einfach die Daten im gebundenen Steuerelement (oder direkt in den Eigenschaften des Objekts). Die Datenbindungsarchitektur aktualisiert die Daten im Objekt.
Wenn Ihre Anwendung die Nachverfolgung von Änderungen und das Zurücksetzen vorgeschlagener Änderungen an ihren ursprünglichen Werten erfordert, müssen Sie diese Funktionalität in Ihrem Objektmodell implementieren. Beispiele dafür, wie Datentabellen vorgeschlagene Änderungen nachverfolgen, siehe DataRowState, , HasChangesund GetChanges.
Speichern von Daten aus Objekten zurück in die Datenbank
Speichern Sie Daten zurück in der Datenbank, indem Sie die Werte aus Ihrem Objekt an die DBDirect-Methoden des TableAdapter übergeben.
Visual Studio erstellt DBDirect-Methoden, die direkt für die Datenbank ausgeführt werden können. Diese Methoden erfordern keine DataSet- oder DataTable-Objekte.
| TableAdapter DBDirect-Methode | BESCHREIBUNG |
|---|---|
TableAdapter.Insert |
Fügt einer Datenbank neue Datensätze hinzu, sodass Sie einzelne Spaltenwerte als Methodenparameter übergeben können. |
TableAdapter.Update |
Aktualisiert vorhandene Datensätze in einer Datenbank. Die Update-Methode verwendet ursprüngliche und neue Spaltenwerte als Methodenparameter. Die ursprünglichen Werte werden verwendet, um den ursprünglichen Datensatz zu finden, und die neuen Werte werden verwendet, um diesen Datensatz zu aktualisieren. Die TableAdapter.Update-Methode wird auch verwendet, um Änderungen in einem Dataset wieder mit der Datenbank abzugleichen, indem ein DataSet, DataTable, DataRow oder ein Array von DataRows als Methodenparameter verwendet wird. |
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 von Objekten (z. B. mithilfe einer for-next-Schleife). Senden Sie die Werte für jedes Objekt mithilfe der DBDirect-Methoden von TableAdapter an die Datenbank.
Das folgende Beispiel zeigt, wie Sie mit der TableAdapter.Insert DBDirect-Methode einen neuen Kunden direkt in die Datenbank einfügen:
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);
}