Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
51m 42s
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.
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.
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.
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. Ponieważ rozwijana lista ma wyświetlać turnieje, lista bazowa 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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy