Zum Fußzeileninhalt springen
Iron Academy Logo
C#-Anwendung
C#-Anwendung

Andere Kategorien

Erstellung eines C# WinForms-Dashboard-Formulars

Tim Corey
51m 42s

In Lektion 21 der C# App From Start to Finish Serie konzentriert sich Tim Corey auf das Verbinden des Turnier-Dashboard-Forms in einer WinForms-Anwendung. Dieses Formular fungiert als Startbildschirm der Anwendung und dient als Einstiegspunkt für Benutzer, um entweder ein vorhandenes Turnier zu laden oder ein neues zu erstellen. Ein WinForms-Dashboard ist ein Programm, das die ereignisgesteuerte Funktionalität von Windows Forms nutzt, wobei Benutzeraktionen spezifische Ereignisse auslösen, die vom Code behandelt werden.

Tim erklärt, dass es in dieser Lektion nicht um komplexe UI-Arbeit geht, sondern darum, Daten, Modelle, gespeicherte Prozeduren und Formulare auf saubere und konsistente Weise miteinander zu verbinden. Hinweis: WinForms eignet sich besonders für interne Unternehmenssoftware wie Bestandsverwaltung, CRM-Systeme und buchhalterische Werkzeuge. Um wirklich zu verstehen, wie ein WinForms-Dashboard in einer realen Anwendung funktioniert, führt Tim Schritt für Schritt durch das Laden von Turnieren, das Hydrieren von Modellen, das Verwalten von Datenbankverbindungen und das Verbinden von UI-Steuerelementen.

In diesem Artikel werden wir einen genaueren Blick auf das Dashboard-Form werfen, indem wir Tims Video Erklärung genau folgen, Abschnitt für Abschnitt, mit Zeitstempeln für eine einfache Referenz. WinForms-Anwendungen sind im Allgemeinen schlank und bieten eine hervorragende Performance, was sie ideal für ältere oder weniger leistungsstarke Hardware macht.

Einführung in das Dashboard-Form

Ganz am Anfang stellt Tim Lektion 21 vor und erklärt das Ziel: das Verdrahten des Turnier-Dashboard-Forms, das das erste Formular sein wird, das gestartet wird, wenn die Anwendung startet.

Tim weist darauf hin, dass dieses Formular absichtlich einfach ist. Es tut nur wenige Dinge:

  • Lädt eine Liste bestehender Turniere

  • Ermöglicht dem Benutzer, ein Turnier auszuwählen und zu laden

  • Ermöglicht dem Benutzer, ein neues Turnier zu erstellen

Er versichert den Zuschauern, dass dies keine lange oder übermäßig komplexe Lektion sein wird, aber sie wird viele wichtige Teile des Systems berühren.

Wofür das Dashboard-Form verantwortlich ist

Tim erklärt, dass das Dashboard-Form zwei Hauptverantwortlichkeiten hat:

  1. Vorhandene Turniere in ein Dropdown laden

  2. Andere Formulare basierend auf Benutzeraktionen öffnen

Wenn ein Turnier bereits existiert, kann der Benutzer es auswählen und auf Turnier laden klicken (wird später verdrahtet). Wenn der Benutzer ein neues Turnier erstellen möchte, klickt er auf Turnier erstellen, was ein Formular öffnet, das bereits im Projekt existiert.

An diesem Punkt stellt Tim klar, dass der Turnier laden Button noch nicht verdrahtet ist und in einer späteren Lektion behandelt wird.

Erstellen der Turnierliste für das Dropdown

Nach Auswahl des C#-Projektdatentyps öffnet Visual Studio ein Formular zur Gestaltung der Benutzeroberfläche.

Tim wechselt zum Code-Behind des Formulars und erklärt, dass das Dropdown eine Backend-Liste benötigt. Beachten Sie, wie das Formular im Designer erscheint, bereit zur UI-Anpassung. Da das Dropdown Turniere anzeigen soll, muss die Backend-Liste eine List sein.

Er erstellt eine private Liste namens tournaments und erklärt, dass statt manuell eine neue Liste zu erstellen, die Daten von der GlobalConfig-Verbindung kommen sollen, die abstrahiert, ob die Datenquelle SQL oder Textdateien sind.

Tim versucht dann, eine Methode namens GetTournament_All aufzurufen, bemerkt, dass sie noch nicht existiert und erklärt, dass diese Methode zur Datenschicht hinzugefügt werden muss.

Hinzufügen von GetTournament_All zur Datenschicht

Tim wechselt in den SQL Connector und implementiert die fehlende GetTournament_All Methode. Er erklärt, dass diese Methode eine Liste von TournamentModel-Objekten zurückgeben wird.

Er kopiert ein bestehendes Muster, das anderswo im Projekt verwendet wird, und passt es für Turniere an. Der Hauptunterschied besteht darin, dass diese Methode eine gespeicherte Prozedur namens aufruft:

spTournaments_GetAll

Tim erklärt, dass diese gespeicherte Prozedur nur die grundlegenden Turnierdaten abruft:

  • ID

  • Turniername

  • Anmeldegebühr

  • Aktiver Status

Er weist darauf hin, dass das TournamentModel zwar weit mehr Eigenschaften enthält, dies jedoch nur der erste Schritt ist.

Verstehen der teilweisen Modellhydration

Tim pausiert, um ein wichtiges Konzept zu erklären: die teilweise Hydration.

Obwohl das TournamentModel Teams, Preise und Runden beinhaltet, sind diese Eigenschaften noch nicht gefüllt. In diesem Stadium:

  • Teams sind leer

  • Preise sind leer

  • Runden sind leer

Es wird erwartet, dass an dieser Stelle nur die Basisturniereigenschaften gefüllt sind, während verwandte Entitäten wie Teams, Preise und Runden leer bleiben, bis weiteres Laden erfolgt.

Tim betont, dass dies beabsichtigt ist und dass diese verwandten Entitäten erst nach dem Laden der Basisturniereinträge gefüllt werden müssen.

Befüllen von Preisen für jedes Turnier

Tim führt eine foreach-Schleife ein, die über jedes aus der Datenbank zurückgegebene Turnier iteriert.

Für Preise erklärt er, dass der Prozess einfach ist:

  • Rufen Sie eine gespeicherte Prozedur auf, die die Preise nach Turnier-ID abruft

  • Weisen Sie das Ergebnis T.Prizes zu

Er verweist auf die gespeicherte Prozedur spPrizes_GetByTournament und erklärt, dass sie alle mit einem bestimmten Turnier verbundenen Preise zurückgibt.

Dieses Muster - Basisdaten laden, dann Unterdaten nach ID laden - hebt Tim als wiederkehrend in der gesamten Anwendung hervor.

Laden von Teams und Teammitgliedern

Als Nächstes geht Tim zu eingetragenen Teams über.

Er erklärt, dass das Laden von Teams ein zweistufiger Prozess ist:

  1. Laden der mit dem Turnier verbundenen Teams

  2. Für jedes Team die Teammittelglieder laden

Er verwendet eine gespeicherte Prozedur namens spTeams_GetByTournament, um nur die Teams abzurufen, die für das aktuelle Turnier relevant sind.

Dann wiederverwendet Tim für jedes Team eine bestehende Methode, um Teammittelglieder nach Team-ID zu laden. Er weist darauf hin, dass dies fast identisch mit einem vorher in der Serie geschriebenem Code ist, nur für turnierspezifische Daten angepasst.

Einführung in die Komplexität von Runden

Tim erklärt, dass Runden der komplexeste Teil des Turniermodells sind.

Runden werden gespeichert als:

List<List<MatchupModel>>

Um sie zu füllen, muss Tim:

  • Alle Matchups für das Turnier laden

  • Matchup-Einträge für jedes Matchup laden

  • Beziehungen wie Eltern-Matchups und Gewinner auflösen

Er beginnt mit der Überprüfung der gespeicherten Prozeduren:

  • spMatchups_GetByTournament

  • spMatchupEntries_GetByMatchup

Umgang mit Gewinner-IDs und verschachtelten Modellen

Tim weist auf ein häufiges Problem bei der Arbeit mit Datenbanken hin:\ SQL gibt IDs zurück, aber die Anwendung erwartet Objekte.

Die Winner-Eigenschaft ist ein TeamModel, aber die Datenbank gibt nur eine WinnerId zurück. Tim erklärt, dass Sie verschachtelte Objekte nicht direkt aus SQL hydratisieren können.

Um das zu lösen, fügt er dem Modell eine temporäre WinnerId-Eigenschaft hinzu, die nur während des Datenladens verwendet wird. Sobald alle Teams geladen sind, verwendet er die ID, um das korrekte TeamModel der Winner-Eigenschaft zuzuweisen.

Füllen von Matchup-Einträgen und Eltern-Matchups

Für jedes Matchup:

  • Lädt Tim Matchup-Einträge nach Matchup-ID

  • Prüft auf gültige Team-IDs

  • Verwendet eine gespeicherte Liste aller Teams, um Beziehungen aufzulösen

Er erklärt, warum IDs standardmäßig 0 sind, wenn kein Wert vorhanden ist und warum das Prüfen auf > 0 wesentlich ist.

Tim erklärt auch, wie Eltern-Matchups durch Referenzierung bereits geladener Matchups gelöst werden, indem auf die Tatsache vertraut wird, dass Matchups nach Runde geordnet sind.

Aufbau der Rundenstruktur

Sobald alle Matchups vollständig gefüllt sind, erklärt Tim, wie Runden konstruiert werden.

Er führt ein:

  • Ein currentRound-Variable

  • Eine currentRow-Liste

Während er durch Matchups schleift:

  • Wenn sich die Rundennummer ändert, wird die vorherige Runde zu T.Rounds hinzugefügt

  • Eine neue Rundenliste wird erstellt

  • Matchups werden entsprechend gruppiert

Tim geht durch ein vollständiges Beispiel, um sicherzustellen, dass die Logik klar ist, und betont, dass das Trennen von Schleifen den Code verständlicher macht.

Verdrahten des Dashboard-Dropdowns

Sie können gängige Steuerelemente wie Labels, Textboxen und Dropdowns zum Formular hinzufügen, indem Sie sie aus dem Toolbox in Visual Studio ziehen.

Zurück im Dashboard-Form erstellt Tim eine WireUpLists()-Methode.

Er weist zu:

  • DataSource zur tournaments-Liste

  • DisplayMember zu TournamentName

Labels werden oft verwendet, um den Zweck des Dropdowns zu beschreiben, während Textboxen für Benutzereingaben im Formular verwendet werden können. Um mit Benutzerinteraktionen umzugehen, können Sie im Designer doppelt auf eine Schaltfläche klicken, um automatisch einen Click-Ereignishandler in der Form1.cs-Datei zu generieren.

Er erklärt, dass dies das ist, was das Dropdown humane Namen anzeigt anstatt Objektverweise.

Testen von SQL- und Textdateien-Verbindungen

Tim führt die Anwendung mit beiden Datenquellen aus:

  • Textdateien-Verbindung funktioniert sofort

  • SQL-Verbindung gibt einen Fehler aus

Sie können die Anwendung durch Auswahl der Start-Taste oder Drücken von F5 in Visual Studio ausführen.

Er geht durch die Fehlermeldung, identifiziert, dass dieser Fehler durch fehlende Parameter verursacht wurde, und stellt fest, dass solche Fehler häufig beim Integrieren mehrerer Datenquellen sind. Dieser Fehler wurde behoben, indem die Turnier-ID korrekt an gespeicherte Prozeduren übergeben wurde.

Nach Behebung sowohl von Preisen als auch Teams bestätigt Tim, dass beide Datenquellen nun korrekt funktionieren. Fehler identifizieren und beheben ist ein normaler Teil des Entwicklungsprozesses, insbesondere beim Integrieren mehrerer Datenquellen.

Verdrahten des Button zur Turniererstellung

Schließlich verbindet Tim den Button "Create Tournament" (Turnier erstellen), indem er seine Ereignisse, insbesondere das Klick-Ereignis, behandelt.

Er erklärt, dass der Ereignis-Handling-Code für den Button im Code-Behind-File (Form1.cs) und nicht in der Form1.Designer.cs-Datei geschrieben wird. Die Form1.Designer.cs-Datei generiert automatisch UI-Code für Windows Forms und sollte nicht manuell editiert werden.

Der Button führt einfach aus:

  • Erstellt eine neue Instanz des Create Tournament-Forms

  • Ruft Show() auf

Er diskutiert Designentscheidungen darüber, wohin der Nutzer nach dem Erstellen eines Turniers gehen sollte, und erklärt, warum es am sinnvollsten ist, direkt zum Turnier-Viewer zu navigieren.

Fazit und Nächste Schritte

Tim fasst zusammen, was erledigt wurde:

  • Das Dashboard lädt Turniere

  • Das Dropdown-Menü wird korrekt gefüllt

  • Das Create Tournament-Form öffnet sich erfolgreich

Er merkt an, dass die Auffrischung der Liste nach der Erstellung eines Turniers später behandelt wird.

In der nächsten Lektion gibt Tim einen Ausblick auf das Tournament Viewer-Form, in dem Runden, Begegnungen, Punktestand und Fortschritt implementiert werden—um das Turniersystem zum Leben zu erwecken. Zukünftige Versionen dieser Lektion werden zusätzliche Funktionen und Verbesserungen abdecken, einschließlich Updates im Zusammenhang mit neuen Versionen von WinForms und .NET.

Diese Lektion zeigt, wie ein WinForms-Dashboard nicht nur eine Benutzeroberfläche, sondern ein Koordinationspunkt zwischen Modellen, Datenzugriff und Navigation ist—etwas, das Tim sorgfältig Schritt für Schritt demonstriert.

WinForms bleibt aufgrund seiner Stabilität, der schnellen Entwicklungsgeschwindigkeit und der tiefen Integration in das Windows-Betriebssystem hochrelevant.

Hero Worlddot related to Erstellung eines C# WinForms-Dashboard-Formulars
Hero Affiliate related to Erstellung eines C# WinForms-Dashboard-Formulars

Verdienen Sie mehr, indem Sie teilen, was Sie lieben

Erstellen Sie Inhalte für Entwickler, die mit .NET, C#, Java, Python oder Node.js arbeiten? Verwandeln Sie Ihr Fachwissen in ein zusätzliches Einkommen!

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an