Share via


Exemplarische Vorgehensweise: Erstellen von Master/Detailbeziehungen in Windows Forms mit Hilfe von Visual J#

In vielen Anwendungsszenarien ist es erforderlich, mit Daten zu arbeiten, die aus mehr als einer Tabelle bzw. aus verknüpften Tabellen stammen. Dies erfordert das Arbeiten mit einer Master/Detailbeziehung zwischen einer untergeordneten und einer übergeordneten Tabelle. Ein Beispiel ist das Aufrufen eines Kundendatensatzes und das Anzeigen der dazugehörigen Aufträge.

Mit dem getrennten Dataset-Modell in Visual Studio können Sie in der Anwendung mit mehreren eigenständigen Tabellen arbeiten und eine Beziehung zwischen ihnen definieren. Anschließend können Sie mit der Beziehung zwischen verknüpften Datensätzen navigieren.

In dieser exemplarischen Vorgehensweise wird ein einfaches, aber vollständiges Beispiel für das Arbeiten mit verknüpften Tabellen in einem Dataset dargestellt. Sie erstellen ein Windows Form, das Informationen zu den Verlagen (die Master-Datensätze) in einem Listenfeld anzeigt.

In der exemplarischen Vorgehensweise erstellen Sie die Beziehung zwischen den Tabellen. Sie können diese Beziehung dann mit den Funktionen zur Datenbindung im Windows Form verwenden.

Um die exemplarische Vorgehensweise nachzuvollziehen, benötigen Sie:

  • Zugriff auf einen Server mit der SQL Server-Beispieldatenbank Pubs.

Die exemplarische Vorgehensweise ist in kleinere Einheiten gegliedert:

  • Erstellen des Windows Forms.
  • Erstellen und Konfigurieren des Datasets, das die beiden Tabellen enthält. Dies beinhaltet das Erstellen einer Beziehung zwischen den Tabellen.
  • Hinzufügen von Steuerelementen zum Anzeigen und Binden von Daten an die entsprechenden Datenobjekte.
  • Schreiben von Code für das Auffüllen des Datasets beim Ausführen des Formulars.
  • Testen des Formulars.

Erstellen von Projekt und Formular

Im ersten Schritt wird ein Windows Form erstellt.

So erstellen Sie das Projekt und das Formular

  1. Zeigen Sie im Menü Datei auf Neu, und wählen Sie dann Projekt.

  2. Wählen Sie im Bereich Projekttypen die Option Visual J#-Projekte und im Bereich Vorlagen die Option Windows-Anwendung.

  3. Wenn Sie bereits eine Projektmappe geöffnet haben, wählen Sie Projektmappe schließen.

    Hinweis   In Produktionsprojekten sind in einer Projektmappe sehr oft mehrere Projekte enthalten. In dieser exemplarischen Vorgehensweise schließen Sie dagegen sämtliche geöffneten Projektmappen und erstellen eine neue Projektmappe zusammen mit dem Projekt, so dass keine Interferenzen zwischen Ihrem Vorgehen und bereits vorhandenen Formularen, Datasets usw. auftreten.

  4. Weisen Sie dem Projekt einen Namen zu, der eindeutig ist und den verwendeten Namenskonventionen entspricht. Sie können dieses Projekt beispielsweise Walkthrough_MasterDetail nennen.

  5. Nachdem Sie einen Namen zugewiesen und eine neue Projektmappe angegeben haben, klicken Sie auf OK.

    Visual Studio erstellt ein neues Projekt und zeigt ein neues Formular mit der Bezeichnung Form1 im Windows Form-Designer an.

Erstellen und Konfigurieren eines Datasets

Wie bei den meisten Datenzugriffsszenarien in Visual Studio arbeiten Sie mit einem Dataset. Ein Dataset ist ein Container (ein Cache), der die Datensätze enthält, mit denen Sie arbeiten möchten.

Hinweis   Die Verwendung eines Datasets ist nur eine Möglichkeit für den Datenzugriff und ist bei manchen Szenarios nicht optimal. Das Arbeiten mit Master-/Detaildaten ist ein Szenario, in dem Datasets eine gute Datenzugriffsstrategie darstellen. Weitere Informationen finden Sie unter Empfehlungen zur Zugriffsstrategie auf Daten.

In dieser exemplarischen Vorgehensweise fügen Sie ein Dataset zum Formular hinzu. Allerdings führen Sie diesen Vorgang nicht direkt, durch manuelles Hinzufügen des Datasets zum Formular, aus. Stattdessen führen Sie die folgenden Schritte aus:

  • Erstellen Sie mit Hilfe eines Assistenten einen Datenadapter. Der Adapter enthält SQL-Anweisungen zum Lesen und Schreiben von Datenbankinformationen. Mit dem Assistenten können Sie die erforderlichen SQL-Anweisungen festlegen. Gegebenenfalls erstellt der Assistent auch eine Verbindung zur Datenbank.
  • Generieren Sie das Dataset-Schema. Bei diesem Verfahren erstellt Visual Studio eine neue Dataset-Klasse, basierend auf den Tabellen und Spalten, auf die Sie zugreifen. Beim Generieren der Dataset-Klasse fügen Sie auch eine Instanz der Klasse zum Formular hinzu.

Wenn Sie das Generieren des Datasets abgeschlossen haben, enthält es die beiden Tabellen Publishers und Titles aus der standardmäßigen SQL Server-Datenbank Pubs. Die Tabellen haben eine implizite Beziehung. Das Feld pub_id ist der Primärschlüssel der Tabelle Publishers und ein Fremdschlüssel in der Tabelle Titles. Sie wandeln diese implizite Beziehung in eine explizite Beziehung um, die die Steuerelemente im Formular verwenden können.

In diesem Abschnitt der exemplarischen Vorgehensweise führen Sie mehrere Schritte aus, damit Visual Studio das Dataset für Sie erstellt. Weitere Informationen zu Datenadaptern finden Sie unter Einführung in Datenadapter. Weitere Informationen zu Datasets finden Sie unter Einführung in Datasets.

Konfigurieren einer Datenverbindung und eines Datenadapters

Erstellen Sie zu Beginn Datenadapter, die die SQL-Anweisungen zum nachfolgenden Auffüllen des Datasets enthalten. Dabei legen Sie auch eine Verbindung für den Zugriff auf die Datenbank fest. Sie konfigurieren den Datenadapter mit einem Assistenten, wodurch das Erstellen der für den Datenzugriff erforderlichen SQL-Anweisungen vereinfacht wird.

Sie benötigen zwei Datenadapter, um Daten sowohl aus der Tabelle Publishers als auch aus der Tabelle Titles abzurufen.

Hinweis   Wenn der Assistent fertig ist, müssen Sie mit dem nächsten Abschnitt fortfahren, um ein Dataset zu generieren und den Formularteil für den Datenzugriff zu vervollständigen.

So erstellen Sie die Datenverbindung und die Datenadapter

  1. Ziehen Sie in der Toolbox von der Registerkarte Daten ein OleDbDataAdapter-Objekt auf das Formular.

    Hinweis   Sie können auch den SQL-Datenprovider (in diesem Fall das SqlDataAdapter-Objekt) verwenden, der für SQL Server 7.0 oder höher optimiert ist. In dieser exemplarischen Vorgehensweise verwenden Sie OleDbDataAdapter, da dieses Objekt generischer ist und ADO.NET-Zugriff auf alle OLE DB-kompatiblen Datenquellen bietet. Verwenden Sie den SQL-Datenprovider, wenn Sie in den Anwendungen SQL Server 7.0 oder höher verwenden.

    Der Datenadapter-Konfigurations-Assistent wird gestartet. Er bietet Unterstützung sowohl beim Herstellen der Verbindung als auch beim Erstellen des Adapters.

  2. Verfahren Sie im Assistenten wie folgt:

    1. Erstellen oder wählen Sie auf der zweiten Seite eine Verbindung aus, die auf die SQL Server-Datenbank Pubs zeigt. (Klicken Sie auf der ersten Seite auf Weiter, um zur zweiten Seite zu gelangen.)

    2. Legen Sie auf der dritten Seite fest, dass für den Datenbankzugriff eine SQL-Anweisung verwendet werden soll.

    3. Erstellen Sie auf der vierten Seite die folgende SQL-Anweisung:

      SELECT pub_id, pub_name 
      FROM publishers
      

      Geben Sie die Anweisung direkt ein, oder klicken Sie auf Abfrage-Generator, wenn Sie zum Erstellen der Anweisung Hilfe benötigen.

      Hinweis   In dieser exemplarischen Vorgehensweise füllen Sie das Dataset mit allen Zeilen aus der Tabelle Publishers auf. In Produktionsanwendungen optimieren Sie den Datenzugriff in der Regel dadurch, dass Sie eine Abfrage erstellen, die nur die erforderlichen Spalten und Zeilen zurückgibt. Ein Beispiel finden Sie unter Exemplarische Vorgehensweise: Anzeigen von Daten in Windows Forms mit Hilfe von parametrisierten Abfragen unter Verwendung von Visual J#.

  3. Klicken Sie auf Fertig stellen, um den Assistenten zu beenden.

    Nachdem der Assistent den Vorgang vollständig beendet hat, verfügen Sie über eine Verbindung (OleDbConnection1) mit Informationen über den Zugriff auf die Datenbank. Außerdem verfügen Sie über einen Datenadapter (OleDbDataAdapter1) mit der SQL-Anweisung für das Abrufen von Daten aus der Tabelle Publishers.

  4. Ziehen Sie ein weiteres OleDbDataAdapter-Objekt auf das Formular.

    Der Datenadapter-Konfigurations-Assistent wird erneut gestartet.

  5. Wiederholen Sie Schritt 2 mit den folgenden Unterschieden:

    1. Wählen Sie auf der zweiten Seite dieselbe Verbindung aus, die Sie zuvor verwendet bzw. erstellt haben.

    2. Erstellen Sie auf der vierten Seite die folgende SQL-Anweisung für den Zugriff auf die Tabelle Titles:

      SELECT title_id, title, pub_id, price 
      FROM titles
      

      Hinweis   Sie müssen die Spalte pub_id einschließen.

    Der Assistent fügt OleDbDataAdapter2 dem Formular hinzu.

  6. Wenn der Assistent fertig ist, erstellen Sie das Dataset basierend auf der vorher erstellten SQL-Abfrage. Weitere Informationen finden Sie im nächsten Abschnitt.

Erstellen des Datasets

Nach dem Erstellen der Elemente für die Verbindung zur Datenbank und der Definition der gewünschten Informationen (über die SQL-Befehle im Datenadapter) können Sie von Visual Studio ein Dataset erstellen lassen. Das Dataset ist eine Instanz der auf einem entsprechenden XML-Schema (XSD-Datei) basierenden DataSet-Klasse zur Beschreibung der Elemente der Klasse (Tabellen, Spalten und Einschränkungen). Weitere Informationen zur Beziehung zwischen Datasets und Schemas finden Sie unter Einführung in den Datenzugriff mit ADO.NET.

So generieren Sie ein Dataset

  1. Wählen Sie im Menü Daten die Option DataSet generieren.

    Tipp   Klicken Sie in das Formular, wenn das Menü Daten nicht angezeigt wird. Das Formular muss den Fokus für die Anzeige des Menüs haben.

    Das Dialogfeld DataSet generieren wird angezeigt.

  2. Wählen Sie die Option Neu, und bezeichnen Sie das Dataset mit dsPublishersTitels.

    In der Liste unterhalb von Wählen Sie die Tabelle(n) aus, die zum Dataset hinzugefügt werden soll(en) sollten sowohl publishers als auch titles markiert sein.

  3. Aktivieren Sie Dataset zu Designer hinzufügen, und klicken Sie auf OK.

    Visual Studio generiert eine typisierte Dataset-Klasse (dsPublishersTitles) und ein Schema zur Definition des Datasets. Das neue Schema (dsPublishersTitles.xsd) wird im Projektmappen-Explorer angezeigt.

    Tipp   Klicken Sie im Projektmappen-Explorer auf Alle Dateien anzeigen, um die abhängige JSL-Datei der Schemadatei anzuzeigen, die den Code zur Definition der neuen Dataset-Klasse enthält.

    Schließlich fügt Visual Studio dem Formular eine Instanz der neuen Dataset-Klasse (dsPublishersTitles1 – beachten Sie die fortlaufende Nummer) hinzu.

Herstellen einer Beziehung zwischen Dataset-Tabellen

Das Dataset enthält zwei Tabellen mit einer 1:n-Beziehung. Allerdings ist das Dataset ein passiver Container (keine echte Datenbank), der die implizierte Beziehung zwischen Tabellen nicht nutzen kann. Erstellen Sie deshalb ein Datenbeziehungsobjekt, um die Beziehung explizit zu gestalten.

Hinweis   Beachten Sie, dass Sie keine einzelne Abfrage erstellt haben, die die Tabellen Publishers und Titles in der Datenbank verknüpft. Sie haben vielmehr zwei Abfragen erstellt, die separat auf die beiden Tabellen zugreifen. Dadurch können Sie die Navigation, Beziehungen und Aktualisierungen für die beiden Tabellen separat verwalten und verfügen über bedeutend mehr Kontrolle über die Daten, als wenn Sie als Basis für die Dataset-Tabellen eine Verknüpfung gewählt hätten. Weitere Informationen finden Sie unter Einführung in DataRelation-Objekte.

So stellen Sie eine Beziehung zwischen Tabellen her

  1. Doppelklicken Sie im Projektmappen-Explorer auf das Schema für das gerade erstellte Dataset (dsPublishersTitles.xsd).

    Der XML-Designer wird in der Schemaansicht geöffnet und zeigt die beiden Tabellen im Dataset an.

  2. Ziehen Sie in der Toolbox von der Registerkarte XML-Schema ein Relation-Objekt auf die Tabelle Titles (die untergeordnete Tabelle).

    Das Dialogfeld Relation bearbeiten wird mit Standardwerten aus den beiden Tabellen geöffnet.

  3. Stellen Sie sicher, dass die folgenden Werte im Dialogfeld Relation bearbeiten eingestellt sind.

    Einstellung Wert
    Name publisherstitles

    Sie benötigen diesen Namen später; notieren Sie sich den neuen Namen, wenn Sie ihn ändern.

    Übergeordnetes Element publishers
    Untergeordnetes Element titles
    Schlüsselfelder pub_id
    Fremdschlüsselfelder pub_id
    Nur Fremdschlüsseleinschränkung erstellen (Nicht aktiviert)

    Alle oben nicht erwähnten Werte sind für diese exemplarische Vorgehensweise nicht relevant.

  4. Klicken Sie auf OK, um das Dialogfeld Relation bearbeiten zu schließen.

    Im XML-Designer wird zwischen den beiden Tabellen ein Beziehungssymbol angezeigt. Klicken Sie mit der rechten Maustaste auf die Beziehung und dann auf Relation bearbeiten, wenn Sie Beziehungseinstellungen ändern möchten.

  5. Speichern und schließen Sie das Schema im XML-Designer.

Sie haben nun alle Vorkehrungen getroffen, um Informationen aus der Datenbank abzurufen und einem Dataset hinzuzufügen. Sie können jetzt dem Formular Steuerelemente hinzufügen, um die Daten anzuzeigen.

Hinzufügen von Steuerelementen zum Anzeigen der Daten

In dieser exemplarischen Vorgehensweise fügen Sie nur wenige Steuerelemente hinzu: ein ListBox-Steuerelement zum Anzeigen einer Liste von Verlagen und ein DataGrid-Steuerelement zum Anzeigen der Titel für einen Verlag. Sie können gegebenenfalls auch Bezeichnungen für die angezeigten Elemente im Formular hinzufügen.

Anzeigen der Verlage in einem ListBox-Steuerelement

Mit dem ListBox-Steuerelement werden die Verlagsnamen angezeigt. Bei diesem Steuerelement handelt es sich um ein komplex gebundenes Steuerelement, d. h., es kann mehrere Datensätze gleichzeitig behandeln.

So fügen Sie einem Formular ein gebundenes ListBox-Steuerelement zum Anzeigen der Verlage hinzu

  1. Kehren Sie zum Standardformular (Form1) zurück, das beim Erstellen des Projekts geöffnet wurde. Wechseln Sie durch Klicken auf die Registerkarte oben im aktuellen Fenster zum Formular-Designer, falls dies noch nicht geschehen ist.

  2. Ziehen Sie in der Toolbox von der Registerkarte Windows Forms ein ListBox-Steuerelement auf das Formular.

  3. Drücken Sie F4, um das Fenster Eigenschaften anzuzeigen.

  4. Wählen Sie in der DataSource-Eigenschaft dsPublishersTitles1 als Datenquelle aus.

  5. Zeigen Sie in der DisplayMember-Eigenschaft die Dropdownliste an. Wählen Sie publishers, erweitern Sie den Knoten publishers, und wählen Sie dann pub_name.

    Wenn Sie fertig sind, sollte die Bezeichnung der DisplayMember-Eigenschaft publishers.pub_name lauten.

    Durch das Festlegen dieser beiden Eigenschaften wird das ListBox-Steuerelement an das Verlagsnamenfeld der Tabelle Publishers gebunden.

  6. Sie können vor dem Listenfeld auch gegebenenfalls eine Bezeichnung hinzufügen.

Anzeigen der Titel in einem DataGrid-Steuerelement

Jeder Titeldatensatz enthält mehrere Informationseinheiten. Sie sollten deshalb zum Anzeigen von Titeln ein Steuerelement verwenden, mit dem nicht nur mehrere Datensätze, sondern mehrere Spalten angezeigt werden können. Dafür bietet sich das DataGrid-Steuerelement an.

Für diese exemplarische Vorgehensweise konfigurieren Sie das Datenblatt so, dass nur die Titel angezeigt werden, die sich auf die gerade ausgewählten Verlage beziehen. Dabei können Sie die Funktion zur Datenbindung von Windows Forms verwenden.

Sie binden das Datenblatt nicht an die Tabelle Titles, wie Sie vielleicht angenommen haben, sondern an das zuvor erstellte Datenbeziehungsobjekt, das eine Beziehung zwischen Publishers und Titles herstellt. Das Datenbeziehungsobjekt wird als Eigenschaft der Tabelle Publishers offen gelegt. Beim Ausführen des Formulars fragt das Datenbindungsgerüst bei jedem Navigieren zu einem neuen Verlag (durch Auswählen im Listenfeld) das Datenbeziehungsobjekt ab, um die entsprechenden Detaildatensätze zurückzugeben.

So fügen Sie einem Formular ein gebundenes DataGrid-Steuerelement zum Anzeigen der Titel hinzu

  1. Ziehen Sie in der Toolbox von der Registerkarte Windows Forms ein DataGrid-Steuerelement auf das Formular.

  2. Setzen Sie im Fenster Eigenschaften die DataSource-Eigenschaft auf dsPublishersTitles1.

  3. Setzen Sie die DataMember-Eigenschaft auf publishers.publisherstitles. (Geben Sie diesen Wert im Feld ein.)

    Durch das Festlegen dieser beiden Eigenschaften wird das Datenblatt an das Beziehungsobjekt gebunden, so dass es immer untergeordnete Datensätze des aktuellen Verlags enthält.

  4. Ändern Sie die Größe des Datenblattes, um alle Spalten anzuzeigen. Durch Ändern der Höhe können Sie mehrere Titeldatensätze anzeigen.

Auffüllen des Datasets

Obwohl die Steuerelemente im Formular an das von Ihnen erstellte Dataset gebunden sind, wird das Dataset selbst nicht automatisch aufgefüllt. Sie müssen vielmehr das Dataset selbst füllen, indem Sie einen kurzen Code schreiben, der bei der Initialisierung des Formulars ausgeführt wird. Weitere Informationen zum Füllen von Datasets finden Sie unter Einführung in Datasets.

So füllen Sie das Dataset auf

  1. Doppelklicken Sie auf das Formular, um einen Handler für das Load-Ereignis des Formulars zu erstellen.

  2. Löschen Sie in der Methode das von Ihnen erstellte Dataset, und rufen Sie die Fill-Methode der beiden Datenadapter auf. Übergeben Sie dabei jedem Aufruf das aufzufüllende Dataset.

    Das folgende Beispiel zeigt, wie die vollständige Methode aussieht:

    // Visual J#
    private void Form1_Load(Object sender, System.EventArgs e)
    {
       dsPublishersTitles1.Clear();
       oleDbDataAdapter1.Fill(dsPublishersTitles1);
       oleDbDataAdapter2.Fill(dsPublishersTitles1);
       oleDbConnection1.Close(); 
    }
    

Testen

Sie können jetzt das Formular testen, um sicherzustellen, dass die Daten korrekt angezeigt werden.

So testen Sie das Formular

  1. Drücken Sie F5, um das Formular auszuführen.
  2. Wenn das Formular angezeigt wird:
    • Überprüfen Sie, ob das ListBox-Steuerelement die Verlagsnamen anzeigt.
    • Wählen Sie verschiedene Verlage aus, und stellen Sie sicher, dass im Datenblatt ausschließlich die korrekten Titel angezeigt werden.

Nächste Schritte

In dieser exemplarischen Vorgehensweise haben Sie zwei Aufgaben gelöst: Sie haben ein Dataset mit zwei Tabellen und einer Beziehung erstellt, und Sie haben ein Windows Form zum Anzeigen der verknüpften Daten erstellt. Sie können im weiteren Verlauf folgende Schritte ausführen:

  • Anpassen der Spaltenanzeige im Datenblatt. Weitere Informationen dazu finden Sie unter Formatieren von DataGrids in Windows Forms zur Entwurfszeit.
  • Verwenden der Daten, einschließlich der Datenbeziehung, in Ihrem eigenen Code. (In dieser exemplarischen Vorgehensweise wurden alle Aufgaben zur Auflösung verknüpfter untergeordneter Datensätze durch die Datenbindungsarchitektur des Formulars ausgeführt.) Weitere Informationen finden Sie unter Einführung in DataRelation-Objekte und Navigieren in einer Beziehung zwischen Tabellen.
  • Trennen des Datenzugriffs von der Benutzeroberfläche. In dieser exemplarischen Vorgehensweise haben Sie ein Formular erstellt, das mehr oder weniger direkt (über das Dataset) auf die Daten zugreift. Ein flexibleres und einfacher zu verwaltendes Design ist das Erstellen einer Datenzugriffskomponente, die den Datenzugriff behandelt. Das Formular, also die Benutzeroberfläche, könnte dann gegebenenfalls mit der Komponente interagieren. Die gleiche Komponente könnte von mehreren Formularen (und anderen Komponenten) verwendet werden, wodurch der zusätzliche Aufwand für das Neuentwerfen des Datenzugriffs für jedes erstellte Formular entfällt. Weitere Informationen über das Erstellen komponentenbasierten Datenzugriffs finden Sie unter Exemplarische Vorgehensweise: Erstellen einer verteilten Anwendung mit Hilfe von Visual J#.

Siehe auch

Erstellen von Windows Forms | Einführung in Datasets | Einführung in DataRelation-Objekte | Navigieren in einer Beziehung zwischen Tabellen | Exemplarische Vorgehensweisen für Windows Forms