Exemplarische Vorgehensweise: Anzeigen von Daten in Windows Forms mit Hilfe von parametrisierten Abfragen unter Verwendung von Visual J#

Ein typisches Szenario ist die ausschließliche Anzeige von ausgewählten Dateien in einem Formular, beispielsweise die Aufträge für einen bestimmten Kunden oder die Bücher für einen bestimmten Autor. In diesem Szenario geben die Benutzer Informationen in ein Formular ein, danach wird die Abfrage mit der Benutzereingabe als Kriterium ausgeführt. Die Daten werden also basierend auf einer parametrisierten Abfrage ausgewählt. Die Abfrage gibt nur die von den Benutzern benötigten Daten zurück.

Mit parametrisierten Abfragen wird die Anwendung effizienter, indem die Datenbank die Aufgaben ausführt, für die sie am besten geeignet ist, nämlich das Filtern und Sortieren von Datensätzen. Im Gegensatz dazu kann die Anwendung langsam und schwerfällig werden, wenn Sie eine gesamte Datenbanktabelle anfordern, über das Netzwerk übertragen und dann mit der Anwendungslogik nach den gewünschten Datensätzen suchen.

In dieser exemplarischen Vorgehensweise erstellen Sie ein Windows Form, das Autoren aus der SQL Server-Beispieldatenbank Pubs anzeigt. Benutzer können dann den Code für einen US-Bundesstaat (z. B. CA für Kalifornien) eingeben und das Dataset mit einer Liste der in diesem Staat lebenden Autoren auffüllen.

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 Formulars.
  • Erstellen und Konfigurieren des Datasets, an welches das Formular gebunden wird. Dies beinhaltet die Erstellung einer Abfrage, mit deren Hilfe das Dataset aus der Datenbank gefüllt wird.
  • Hinzufügen von Steuerelementen zum Formular.
  • Hinzufügen von Code zum Aktualisieren des Datasets mit neuen Parametern.
  • Hinzufügen von Code zur Navigation zwischen Autoren.

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. Das Dialogfeld Neues Projekt wird angezeigt.

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

  4. 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.

  5. Weisen Sie dem Projekt einen Namen zu, der eindeutig ist und den verwendeten Namenskonventionen entspricht. Sie können dieses Projekt beispielsweise Walkthrough_Parameters nennen. Nachdem Sie einen Namen zugewiesen haben, klicken Sie auf OK, um das Projekt zu erstellen.

    Visual Studio zeigt ein neues Formular 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. Trotzdem sind Datasets normalerweise die richtige Wahl in Windows Forms-Anwendungen. In dieser exemplarischen Vorgehensweise wird ein Dataset verwendet. 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.

Es ist wichtig, dass Sie alle Verfahren in diesem Abschnitt ausführen. Anderenfalls verfügt das Formular nicht über das Dataset, das Sie im weiteren Verlauf der exemplarischen Vorgehensweise verwenden.

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 einen Datenadapter, der die SQL-Anweisung zum nachfolgenden Auffüllen des Datasets enthält. 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.

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 den Datenadapter

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

    Hinweis   Sie können auch das SqlDataAdapter-Objekt verwenden, das 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.

    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 Datenbank Pubs Ihres SQL-Servers 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 au_id, au_lname, state 
      FROM authors 
      WHERE (state = ?)
      

      Das Fragezeichen (?) ist der Platzhalter für den Parameter. (Wenn Sie die SqlDataAdapter-Klasse für den Zugriff auf SQL Server, Version 7.0, verwenden, werden die Parameter mit Hilfe von Variablen mit Namen festgelegt.)

      Tipp   Wenn Sie zum Erstellen der SQL-Anweisung Hilfe benötigen, klicken Sie auf Abfrage-Generator, um den Abfrage-Generator zu starten. Zur Eingabe des Parameterplatzhalters geben Sie das Fragezeichen in die Spalte Criteria des Feldes für den Bundesstaat ein.

    Der Assistent erstellt eine Verbindung (OleDbConnection1) und einen Datenadapter (OleDbDataAdapter1).

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

Der Datenadapter enthält jetzt vier SQL-Anweisungen – nicht nur die von Ihnen erstellte Select-Anweisung, sondern auch Anweisungen zum Aktualisieren, Einfügen und Löschen von Datensätzen. In dieser exemplarischen Vorgehensweise verwenden Sie nur die Select-Anweisung.

Die SQL-Anweisung Select des Adapters wird als Teil der SelectCommand-Eigenschaft des Datenadapters gespeichert. Die SelectCommand-Eigenschaft enthält ein Datenbefehlsobjekt (ein Objekt vom Typ OledbCommand, das wiederum nicht nur die SQL-Anweisung, sondern auch weitere für diese Anweisung erforderliche Informationen enthält. Hervorzuheben ist die im Befehl enthaltene Parameterauflistung. Diese Auflistung enthält ein Parameterobjekt (vom Typ OleDbParameter) für jeden Parameter, der zur und von der SQL-Anweisung übergeben werden soll. In diesem Fall gibt es natürlich nur einen Parameter, nämlich den Wert für die Spalte für den Bundesstaat. Standardmäßig erstellt der Datenadapter-Konfigurations-Assistent den Parameter mit dem Namen der Spalte; der Parameter heißt demzufolge State. Im weiteren Verlauf dieser exemplarischen Vorgehensweise erfahren Sie, wie der Parameterwert vor der Ausführung der SQL-Anweisung festgelegt wird.

Erstellen des Datasets

Nach dem Erstellen der Elemente für die Verbindung zur Datenbank und der Definition der gewünschten Informationen (über den SQL-Befehl im Datenadapter) können Sie von Visual Studio ein Dataset erstellen lassen. Visual Studio kann das Dataset auf der Grundlage der für den Datenadapter angegebenen Abfrage automatisch generieren. Das Dataset ist eine Instanz der auf einem entsprechenden XML-Schema (XSD-Datei) basierenden DataSet-Klasse zur Beschreibung der Elemente der Klasse (Tabelle, 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. Weisen Sie dem Dataset den Namen dsAuthors zu, aktivieren Sie DataSet zum Designer hinzufügen, und klicken Sie auf OK.

    Visual Studio generiert eine typisierte DataSet-Klasse (dsAuthors) und ein Schema zur Definition des Datasets. Das neue Schema (dsAuthors.xsd) wird im Projektmappen-Explorer angezeigt. Wenn Sie im Projektmappen-Explorer auf die Option Alle Dateien anzeigen klicken, werden Sie feststellen, dass die Schemadatei über eine abhängige JSL-Datei mit dem Code zur Definition der neuen Dataset-Klasse verfügt.

    Schließlich wird dem Formular in Visual Studio eine Instanz der neuen Dataset-Klasse (dsAuthors1) hinzugefügt.

Sie haben nun alle Vorkehrungen getroffen, um Informationen aus der Datenbank abzurufen und einem Dataset hinzuzufügen. Sie können jetzt ein Formular erstellen, in dem die Daten angezeigt werden.

Hinzufügen von Steuerelementen zum Anzeigen der Daten

Für diese exemplarische Vorgehensweise muss das Formular über Methoden zur Eingabe des Codes für einen Bundesstaat, zur Ausführung der Abfrage und zur Anzeige von Informationen über Autoren verfügen.

So fügen Sie dem Formular Steuerelemente hinzu

  1. Fügen Sie dem Formular die folgenden Steuerelemente mit den angegebenen Namen hinzu:

    Steuerelement Zweck Name Text
    TextBox Ermöglicht Benutzern die Eingabe des Bundesstaatcodes für anzuzeigende Autoren. txtStateParameter (Leere Zeichenfolge)
    Button Führt die Abfrage aus und füllt das Dataset auf. btnShow Show
    TextBox Zeigt die ID des Autors an. txtAuthorID (Leere Zeichenfolge)
    TextBox Zeigt den Nachnamen des Autors an. txtAuthorLName (Leere Zeichenfolge)
    TextBox Zeigt den Bundesstaat an, in dem der Autor lebt. (Wird in der exemplarischen Vorgehensweise nur zur Illustration angezeigt.) txtAuthorState (Leere Zeichenfolge)
  2. Fügen Sie vor den Textfeldern Bezeichnungen für die jeweilige Funktion ein.

Hinzufügen von Code zum Auffüllen des Datasets

Wenn das Formular angezeigt wird, erfolgt das Auffüllen des Datasets mit Informationen aus der Datenbank nicht automatisch. Vielmehr müssen Sie das Dataset manuell auffüllen. In dieser exemplarischen Vorgehensweise werden jedes Mal, wenn der Benutzer auf die Schaltfläche Show klickt, die im Datenadapter festgelegte Abfrage neu ausgeführt und die Ergebnisse in das Dataset übertragen. In diesem Fall erfordert die Abfrage einen Parameter. Der Parameterwert sind die Informationen, welche die Benutzer in das Textfeld txtStateParameter eingeben.

Sie führen die Abfrage im Code aus, indem Sie die Fill-Methode des Datenadapters aufrufen.

So schreiben Sie Code zum Auffüllen des Datasets

  • Doppelklicken Sie auf die Schaltfläche Show, um eine Methode für das Click-Ereignis zu erstellen. Fügen Sie dem Handler Code hinzu, um die folgenden Vorgänge auszuführen:

    • Festlegen des Wertes des Parameters, der für die zuvor erstellte SQL-Anweisung erforderlich ist. Sie legen diesen Wert entsprechend der Benutzereingabe im Textfeld txtStateParameter fest.
    • Aufrufen der Clear-Methode des Datasets. Wenn Sie den Löschvorgang nicht ausführen, werden die von einer Abfrage zurückgegebenen Datensätze an das Dataset angefügt.
    • Aufrufen der Fill-Methode des Datenadapters, Übergeben eines Verweises auf das Dataset und den Parameterwert zur Aufnahme in die Abfrage.

    Das folgende Beispiel zeigt, wie der Code für die Methode aussieht:

    // Visual J#
    private void btnShow_Click(Object sender, System.EventArgs e)
    {
       oleDbDataAdapter1.get_SelectCommand().get_Parameters().get_Item("state").set_Value ( txtStateParameter.get_Text());
       dsAuthors1.Clear();
       oleDbDataAdapter1.Fill(dsAuthors1);
     oleDbConnection1.Close();
    }
    

Binden der Textfelder an das Dataset

Die drei Autorentextfelder dienen dem Anzeigen von Informationen aus einem einzelnen Datensatz in der Datentabelle Authors des Datasets. Damit dieser Vorgang automatisch ausgeführt wird, binden Sie Spalten in der Datentabelle an die Textfelder. Der Bindungsmechanismus des Formulars gewährleistet, dass die Textfeld-Steuerelemente bei jedem Wechsel zu einem anderen Datensatz automatisch aktualisiert werden.

In der exemplarischen Vorgehensweise binden Sie die Text-Eigenschaft der Textfeld-Steuerelemente an die anzuzeigende Spalte. Sie können faktisch jede beliebige Eigenschaft des Textfeld-Steuerelements an eine beliebige Spalte im Dataset bzw. auch mehrere Eigenschaften eines Steuerelements binden. Weitere Informationen finden Sie unter Datenarchitektur in Windows Forms.

So binden Sie die Textfelder an das Dataset

  1. Kehren Sie wieder zum Formular-Designer zurück.
  2. Wählen Sie das erste Autorentextfeld aus, und drücken Sie F4, um das Fenster Eigenschaften zu öffnen.
  3. Erweitern Sie den Knoten (DataBindings), erweitern Sie für die Text-Eigenschaft dsAuthors und authors, und wählen Sie aus der Dropdownliste die Option au_id.
  4. Wiederholen Sie die Schritte 2 und 3 für die beiden anderen Autorentextfelder, und binden Sie sie an dsAuthors1.authors.au_lname bzw. dsAuthors1.authors.state.

Nun sind alle Steuerelemente vorhanden, um Daten aus jeder Zeile im Dataset anzuzeigen. Sie benötigen allerdings noch eine Methode, um von einer Zeile zur nächsten zu wechseln.

Hinzufügen von Navigationssteuerelementen

Zum Schluss fügen Sie dem Formular Navigationssteuerelemente hinzu. In dieser exemplarischen Vorgehensweise fügen Sie die Schaltflächen Previous und Next hinzu. (Sie könnten auch die Schaltflächen First und Last hinzufügen, allerdings handelt es sich dabei nur um Varianten von Previous und Next.) Sie fügen auch ein Textfeld hinzu, das die aktuelle Position des Datensatzes anzeigt.

In einem Windows Form werden Informationen zu der aktuellen Position und Anzahl von Datensätzen in einer einzelnen Datentabelle sowie Informationen zu den Bindungen zwischen der Datentabelle und Steuerelementen in einem CurrencyManager-Objekt verwaltet. Ein Formular kann mehrere Datentabellen (alle mit unterschiedlichen Bindungen, Laufzeitpositionen und unterschiedlicher Anzahl) mit jeweils einem eigenen CurrencyManager-Objekt enthalten. Zur Verwaltung der verschiedenen möglichen CurrencyManager-Objekte enthält das Formular ein BindingContext-Objekt mit einer Schnittstelle für alle Listenmanager.

Die aktuelle Datensatzposition in einer Datentabelle ist in der Position-Eigenschaft verfügbar, die über das BindingContext-Objekt offengelegt wird. Zur Navigation ändern Sie den Wert dieser Eigenschaft. Zur Bestimmung der Anzahl der Datensätze in einer Datentabelle können Sie im BindingContext-Objekt die Count-Eigenschaft abfragen.

So fügen Sie Navigationssteuerelemente hinzu

  1. Fügen Sie dem Formular die folgenden Steuerelemente mit den angegebenen Eigenschaften hinzu:

    Steuerelement Name Text
    Button btnNext Weiter
    Button btnPrevious Zurück
  2. Erstellen Sie eine Ereignisbehandlungsmethode für das Click-Ereignis der Schaltfläche Previous. Fügen Sie Code hinzu, um die Position-Eigenschaft des BindingContext-Objekts zu dekrementieren. Der Code sieht wie folgt aus:

    // Visual J#
    private void btnPrevious_Click(Object sender, System.EventArgs e)
    {
       this.get_BindingContext().get_Item(dsAuthors1, "authors").set_Position (this.get_BindingContext().get_Item(dsAuthors1, "authors").get_Position () -1 ) ;
    }
    
  3. Führen Sie den gleichen Vorgang für die Schaltfläche Next aus, allerdings mit Inkrementierung der Position. Verwenden Sie Code wie den folgenden:

    // Visual J#
    private void btnNext_Click(Object sender, System.EventArgs e)
    {
       this.get_BindingContext().get_Item(dsAuthors1, "authors").set_Position (this.get_BindingContext().get_Item(dsAuthors1, "authors").get_Position () + 1 ) ;
    }
    

Anzeigen der aktuellen Position des Datensatzes

Sie können nun eine ShowPosition-Methode zur Anzeige der aktuellen Position des Datensatzes erstellen.

So zeigen Sie die aktuelle Position des Datensatzes an

  1. Fügen Sie dem Formular ein TextBox-Steuerelement mit der Bezeichnung txtPosition hinzu.

    Tipp   Setzen Sie die Enabled-Eigenschaft auf False, damit Benutzer zwar die aktuelle Position anzeigen, den Wert des Steuerelements aber nicht ändern können.

  2. Erstellen Sie im Formular eine Methode mit der Bezeichnung ShowPosition. Rufen Sie in der Methode die aktuelle Position aus dem BindingContext-Objekt auf, und zeigen Sie sie im Textfeld an. Das folgende Beispiel zeigt, wie der Code aussieht:

    // Visual J#
    private void ShowPosition()
    {
       int iCnt;
       int iPos;
       iCnt = this.get_BindingContext().get_Item(dsAuthors1, "authors").get_Count();
       iPos = this.get_BindingContext().get_Item(dsAuthors1, "authors").get_Position () + 1;
       if(iCnt == 0)
       {
          txtPosition.set_Text ("(No records)");
       }
       else 
       {
          txtPosition.set_Text( iPos + " of " + iCnt );
       }
    }
    
  3. Fügen Sie der ShowPosition-Methode an einer beliebigen Stelle in der Methode, an der sich die aktuelle Position des Datensatzes ändern kann, einen Aufruf hinzu. Für diese exemplarische Vorgehensweise sind dies folgende Positionen:

    • Nach dem Aufrufen der Fill-Methode in der Ereignisbehandlungsmethode für das Click-Ereignis für die Schaltfläche Show.

    • Nach dem Ändern der Datensatzposition in den Click-Methoden für die Schaltflächen Previous und Next. Die vollständige Ereignisbehandlungsmethode für die Previous-Methode sieht beispielsweise wie folgt aus:

      // Visual J#
      private void btnPrevious_Click(Object sender, System.EventArgs e)
      {
         this.get_BindingContext().get_Item(dsAuthors1, "authors").set_Position (this.get_BindingContext().get_Item(dsAuthors1, "authors").get_Position () - 1 ) ;
      
         ShowPosition();
      }
      

Testen

Sie können jetzt das Formular testen, um sicherzustellen, dass die Daten auf der Grundlage des eingegebenen Parameters korrekt angezeigt werden.

So testen Sie das Formular

  1. Drücken Sie F5, um das Formular auszuführen.

  2. Geben Sie, wenn das Formular angezeigt wird, CA in das Textfeld für den Bundesstaat ein, und klicken Sie auf Show.

    Es wird dann der erste Autor, der in Kalifornien lebt, angezeigt.

  3. Klicken Sie auf die Schaltflächen Next und Previous, um durch die Autoren zu navigieren.

  4. Geben Sie einen neuen Wert in das Textfeld für den Bundesstaat ein (z. B. UT für Utah), und klicken Sie auf Show.

    Stellen Sie sicher, dass der neue Autor angezeigt wird und sich die Anzahl der Datensätze geändert hat.

Nächste Schritte

Wenn Sie diese exemplarische Vorgehensweise abgeschlossen haben, verfügen Sie über ein einfaches datengebundenes Formular. Sie können nun unter anderem folgende Verbesserungen vornehmen:

  • Anzeigen von Codes für Bundesstaaten in einem Dropdownlistenfeld, so dass die Eingabe durch Benutzer entfällt. Eine Möglichkeit wäre, dem Formular einen weiteren Datenadapter mit der SQL-Anweisung SELECT DISTINCT state FROM authors hinzuzufügen, ein zweites Dataset zu generieren und ein Listenfeld an dieses Dataset zu binden.

  • Überprüfen der Rückgabe von Datensätzen durch die Abfrage. Dazu können Sie die Count-Eigenschaft des BindingContext-Objekts überprüfen. Wenn sie Null ist, können Sie eine Meldung anzeigen. Im folgenden Beispiel wird eine erweiterte Version des Handlers für die Schaltfläche Show gezeigt, die diese Überprüfung enthält:

    // Visual J#
    private void btnShow_Click(Object sender, System.EventArgs e)
    {
       oleDbDataAdapter1.get_SelectCommand().get_Parameters().get_Item("state").set_Value ( txtStateParameter.get_Text());
       dsAuthors1.Clear();
       oleDbDataAdapter1.Fill(dsAuthors1);
       if(this.get_BindingContext().get_Item(dsAuthors1, "authors").get_Count() == 0)
       {
          MessageBox.Show("No authors found in " + txtStateParameter.get_Text());
          txtStateParameter.Focus();
       }
       else
       {
          ShowPosition();
       }
    }
    
  • Anzeigen der Autoren in einem datengebundenen Datenblatt statt in einzelnen Steuerelementen. Damit können alle Autoren gleichzeitig angezeigt werden.

  • Hinzufügen von Schaltflächen, mit denen Benutzer Autoren hinzufügen, bearbeiten und löschen können.

Siehe auch

Einführung in Datasets | Einführung in Datenadapter | Datenarchitektur in Windows Forms | Exemplarische Vorgehensweisen für Windows Forms