Budowanie Formy Dashboard WinForms C#
W lekcji 21 serii C# App From Start to Finish Tim Corey skupia się na połączeniu Formularza Deskuorta Turniejowego w aplikacji WinForms. Ten formularz działa jako ekran startowy aplikacji i jako punkt wejścia dla użytkownika do załadunku istniejącego turnieju lub utworzenia nowego. Pulpit nawigacyjny WinForms to program, który wykorzystuje funkcjonalność opartą na zdarzeniach Windows Forms, gdzie działania użytkownika wywołują konkretne zdarzenia obsługiwane przez kod.
Tim wyjaśnia, że ta lekcja nie dotyczy skomplikowanej pracy z interfejsem użytkownika, ale raczej dotyczy łączenia danych, modeli, procedur przechowywanych i formularzy w czysty i spójny sposób. Uwaga: WinForms jest szczególnie odpowiedni dla wewnętrznego oprogramowania firmowego, takiego jak zarządzanie zapasami, systemy CRM i narzędzia księgowe. Aby naprawdę zrozumieć, jak działa pulpit nawigacyjny WinForms w rzeczywistej aplikacji, Tim przechodzi krok po kroku przez ładowanie turniejów, hydratację modeli, obsługę połączeń z bazą danych i połączenie kontrolerów UI.
W tym artykule przyjrzymy się głębiej Formularzowi Deskuorta, postępując dokładnie zgodnie z wyjaśnieniem Tima krok po kroku, z włączonymi znacznikami czasowymi dla łatwego odniesienia. Aplikacje WinForms są zazwyczaj lekkie i oferują doskonałą wydajność, co czyni je idealnymi dla starszego lub mniej wydajnego sprzętu.
Wprowadzenie do Formularza Deskuorta
Na samym początku Tim wprowadza Lekcję 21 i wyjaśnia cel: połączenie Formularza Deskuorta Turniejowego, który będzie pierwszym formularzem uruchamianym po starcie aplikacji.
Tim podkreśla, że ten formularz jest celowo prosty. Wykonuje tylko kilka funkcji:
-
Ładuje listę istniejących turniejów
-
Pozwala użytkownikowi wybrać i załadować turniej
- Pozwala użytkownikowi utworzyć nowy turniej
On zapewnia widzów, że nie będzie to długa ani zbytnio skomplikowana lekcja, ale dotknie wielu ważnych części systemu.
Zadania Formularza Deskuorta
Tim wyjaśnia, że formularz deskuorta ma dwa główne zadania:
-
Ładowanie istniejących turniejów do rozwijanej listy
- Otwieranie innych formularzy w zależności od działań użytkownika
Jeśli turniej już istnieje, użytkownik może go wybrać i kliknąć Załaduj Turniej (co zostanie połączone później). Jeśli użytkownik chce stworzyć nowy turniej, klikają Utwórz Turniej, co otwiera formularz już istniejący w projekcie.
W tym momencie Tim precyzuje, że przycisk Załaduj Turniej nie jest jeszcze połączony i zostanie obsłużony w późniejszej lekcji.
Tworzenie listy turniejów dla rozwijanej listy
Po wybraniu szablonu projektu C# Visual Studio otwiera formularz, abyś zaprojektował interfejs użytkownika.
Tim przełącza się na kod-za formularzem i wyjaśnia, że rozwijana lista potrzebuje listy wspierającej. Zauważ, jak formularz pojawia się w projektancie, gotowy do dostosowania UI. Gdy rozwijana lista ma wyświetlać turnieje, lista wspierająca musi być List< TournamentModel>.
Tworzy prywatną listę nazwaną tournaments i wyjaśnia, że zamiast ręcznie tworzyć nową listę, dane powinny pochodzić z połączenia GlobalConfig, który abstraktuje pochodzenie danych, czy to z SQL, czy z plików tekstowych.
Tim nastepnie probuje wywolac metode o nazwie GetTournament_All, zauwaza, ze jeszcze nie istnieje, i wyjasnia, ze ta metoda musi zostac dodana do warstwy dostepu do danych.
Dodawanie GetTournament_All do Warstwy Danych
Tim przechodzi do lacznika SQL i implementuje brakujaca metode GetTournament_All. Wyjasnia, ze ta metoda zwroci liste obiektow TournamentModel.
Kopiuje istniejacy wzorzec uzywany w innych miejscach projektu i dostosowuje go do turniejow. Kluczowa roznica polega na tym, ze ta metoda wywoluje procedury składowane o nazwie:
spTournaments_GetAll
Tim wyjasnia, ze ta procedura składowana pobiera jedynie podstawowe dane turniejowe:
-
ID
-
Nazwa turnieju
-
Opłata za wstęp
- Status aktywnosci
Zauwaza, ze chociaz TournamentModel zawiera wiele wiecej wlasciwosci, jest to dopiero pierwszy krok.
Zrozumienie Czesciowego Nawadniania Modelu
Tim zatrzymuje sie, by wyjasnic wazne pojecie: czesciowe nawadnianie.
Chociaz model turnieju obejmuje zespoly, nagrody i rundy, te wlasciwosci nie sa jeszcze uzupelnione. Na tym etapie:
-
Zespoly sa puste
-
Nagrody sa puste
- Rundy sa puste
Zaklada sie, ze tylko podstawowe wlasciwosci turniejowe sa uzupelnione w tym momencie, podczas gdy powiazane podmioty, takie jak zespoly, nagrody i rundy, pozostaja puste do czasu dalszego ladowania.
Tim podkresla, ze jest to zamierzone i te powiazane podmioty musza zostac uzupelnione po zaladowaniu podstawowych rekordow turniejowych.
Uzupelnianie Nagród dla Kazdego Turnieju
Tim wprowadza petle foreach, ktora iteruje po kazdym turnieju zwroconym z bazy danych.
W przypadku nagród wyjasnia, ze proces jest prosty:
-
Wywolaj procedury składowane, ktore pobieraja nagrody wg ID turnieju
- Przypisz wynik do T.Prizes
Odnosi sie do procedury składowanej spPrizes_GetByTournament i wyjasnia, ze zwraca wszystkie nagrody zwiazane z danym turniejem.
Ten wzorzec - zaladuj dane podstawowe, a nastepnie dane potomne wg ID - Tim podkresla jako powtarzajacy sie w calej aplikacji.
Ładowanie Zespołów i Ich Członków
Nastepnie Tim przechodzi do wprowadzonych zespolow.
Wyjasnia, ze ladowanie zespolow to dwuetapowy proces:
-
Zaladuj zespoly powiazane z turniejem
- Dla kazdego zespolu, zaladuj czlonkow zespolu
Uzywa procedury składowanej o nazwie spTeams_GetByTournament, aby pobrac tylko zespoly istotne dla biezacego turnieju.
Nastepnie, dla kazdego zespolu, Tim ponownie uzywa istniejacej metody do ladowania czlonkow zespolu wg ID zespolu. Zauwaza, ze jest to niemal identyczne z kodem napisanym wczesniej w tej serii, tylko dostosowane do danych specyficznych dla turnieju.
Wprowadzenie do Zlozonosci Rund
Tim wyjasnia, ze rundy sa najbardziej zlozona czescia modelu turniejowego.
Rundy sa przechowywane jako:
Lista<Lista<MatchupModel>>
Aby je uzupelnic, Tim musi:
-
Zaladowac wszystkie dopasowania dla turnieju
-
Zaladowac wpisy dopasowan dla kazdego dopasowania
- Rozwiazac relacje, takie jak dopasowania rodzicow i zwyciezcow
Zaczyna od przegladu procedur składowanych:
-
spMatchups_GetByTournament
- spMatchupEntries_GetByMatchup
Obsluga ID Zwyciezców i Zagniezdzonych Modeli
Tim wskazuje na powszechne problemy w pracy z bazami danych: SQL zwraca ID, ale aplikacja oczekuje obiektow.
Wlasciwosc Zwyciezca jest typu TeamModel, ale baza danych zwraca tylko WinnerId. Tim wyjasnia, ze nie mozna nawodnic zagniezdzonych obiektow bezposrednio z SQL.
Aby to rozwiazac, dodaje tymczasowa wlasciwosc WinnerId do modelu, ktora uzywana jest tylko w trakcie ladowania danych. Po zaladowaniu wszystkich zespolow, uzywa ID, aby przypisac odpowiedni TeamModel do wlasciwosci Zwyciezca.
Uzupelnianie Wpisow Dopasowan i Dopasowan Rodzicow
Dla kazdego dopasowania, Tim:
-
Laduje wpisy dopasowan wg ID dopasowania
-
Sprawdza poprawne IDs zespolow
- Uzywa zapisanej w pamieci listy wszystkich zespolow do rozwiazywania relacji
Wyjasnia, dlaczego ID domyslnie przyjmują wartość 0, gdy nie ma wartości i dlaczego sprawdzanie > 0 jest istotne.
Tim rowniez wyjasnia, jak dopasowania rodzicow sa rozwiazywane przez odwolanie do juz zaladowanych dopasowan, opierajac sie na fakcie, ze dopasowania sa uporzadkowane wedlug rund.
Budowanie Struktury Rund
Gdy wszystkie dopasowania sa w pelni uzupelnione, Tim wyjasnia, jak rundy sa zbudowane.
Wprowadza:
-
Zmienna currentRound
- Liste currentRow
Podczas przegladania dopasowan:
-
Jesli numer rundy sie zmienia, poprzednia runda jest dodawana do T.Rounds
-
Tworzona jest nowa lista rund
- Dopasowania sa odpowiednio grupowane
Tim przechodzi przez pelny przyklad, aby upewnic sie, ze logika jest jasna, i podkresla, ze oddzielanie petli sprawia, ze kod jest latwiejszy do zrozumienia.
Podlaczanie Rozwijanych List na Tablicy Rozdzielczej
Mozesz dodawac typowe kontrolki, takie jak etykiety, pola tekstowe i rozwijane listy do formularza, przeciagnijac je z przybornika w Visual Studio.
Z powrotem w formularzu tablicy rozdzielczej, Tim tworzy metode WireUpLists().
Przydziela:
-
DataSource do listy turniejow
- DisplayMember do TournamentName
Etykiety sa czesto uzywane do opisania celu rozwijalnej listy, podczas gdy pola tekstowe moga byc uzywane do wprowadzania danych przez uzytkownika w formularzu. Aby obsluzyc interakcje uzytkownika, mozesz kliknac dwukrotnie przycisk w projektancie, aby automatycznie wygenerowac obsluge zdarzenia Click w pliku Form1.cs.
Wyjasnia, ze to wlasnie pozwala, aby rozwijalna lista wyswietlala czytelne nazwy zamiast odniesien do obiektow.
Testowanie Polaczen SQL i Plików Tekstowych
Tim uruchamia aplikacje uzywajac obu źródel danych:
-
Polaczenie z plikiem tekstowym dziala natychmiast
- Polaczenie SQL wyrzuca blad
Mozesz uruchomic aplikacje, wybierajac przycisk Start lub naciskajac F5 w Visual Studio.
Przechodzi przez komunikat o bledzie, identyfikuje, ze blad byl spowodowany brakujacymi parametrami i odnotowuje, ze takie bledy sa czeste, gdy integruje sie wiele źródel danych. Ten blad zostal naprawiony przez prawidlowe przekazywanie ID turnieju do procedur składowanych.
Po naprawie nagród i zespolow, Tim potwierdza, ze oba źródla danych teraz dzialaja poprawnie. Identyfikacja i naprawa bledow jest normalna czescia procesu projektowego, szczegolnie podczas integracji wielu źródel danych.
Podlaczanie Przycisku Utwórz Turniej
W koncu Tim podlacza przycisk Utwórz Turniej, obslugujac jego zdarzenia, zwlaszcza zdarzenie Click.
Wyjasnia, ze kod obslugujacy zdarzenia dla przycisku jest pisany w pliku kodu zaplecza (Form1.cs), nie w pliku Form1.Designer.cs. Plik Form1.Designer.cs automatycznie generuje kod UI dla Windows Forms i nie powinien byc recznie edytowany.
Przycisk po prostu:
-
Tworzy nowa instancje formularza Utworz Turniej
- Wywoluje Show()
Omawia decyzje projektowe dotyczace tego, gdzie uzytkownik powinien sie udac po utworzeniu turnieju i wyjasnia, dlaczego nawigacja bezposrednio do przegladarki turniejow ma najwiekszy sens.
Podsumowanie i Co Dalej
Tim konczy, podsumowujac wykonana prace:
-
Tablica rozdzielcza laduje turnieje
-
Rozwijana lista jest uzupelniona poprawnie
- Formularz Utwórz Turniej otwiera sie pomyslnie
Zauwaza, ze odswiezanie listy po utworzeniu turnieju bedzie obslugiwane pozniej.
W nastepnej lekcji, Tim przedsmak da przegladarce turniejow, gdzie rundy, dopasowania, punktacja i progresja będą implementowane—ożywiając system turniejowy. Przyszle wersje tej lekcji obejmą dodatkowe funkcje i udoskonalenia, w tym aktualizacje związane z nowymi wydaniami wersji WinForms i .NET.
Ta lekcja pokazuje, jak tablica rozdzielcza WinForms nie jest tylko UI, ale punktem koordynacyjnym między modelami, dostępem do danych i nawigacją—co Tim starannie demonstruje krok po kroku.
WinForms pozostaja wysoce istotne ze wzgledu na swoja stabilnosc, szybki czas rozwoju i gleboka integracje z systemem operacyjnym Windows.
