Przejdź do treści stopki
Iron Academy Logo
Aplikacja C#
Aplikacja C#

Inne Kategorie

Wiązanie Danych WinForms Wyjaśnione Przez Tima Coreya przez Viewer Turnieju

[{academy-video-youtube{"vid": "mg7TlkPgq2Y", "start_time": "0", "title": "C# App Start To Finish Lesson 22 - Tournament Viewer Part 1", "creator": "Tim Corey", "length": "1h 11m 40s"}}]

Wprowadzenie

W Lekcji 22 serii C# App Start to Finish, Tim Corey zaczyna prace nad przeglądarką turniejów, skupiając się intensywnie na wiązaniu danych WinForms. Tim wyjaśnia, że ta lekcja nie dotyczy zapisywania danych do baz danych ani plików tekstowych—to przyjdzie później. Zamiast tego, całym celem tego filmu jest skonfigurowanie interfejsu użytkownika, uzupelnienie kontrolek i zrozumienie, jak dane przemieszczają się między modelami a kontrolkami WinForms za pomocą wiązania danych.

Tim klaruje, że wiązanie danych WinForms może być niezgrabne, mylące i czasem frustrujące. Z tego powodu, ta lekcja staje się głębokim, praktycznym przejściem przez to, jak wiązanie danych faktycznie się zachowuje, co je psuje i jak to naprawić. Podążając za drogą debugowania Tim'a, uzyskujemy realistyczne i wartościowe zrozumienie mechanik wiązania WinForms.

Przegląd Formularza Przeglądacza Turniejowego

Tim zaczyna od opisania, co formularz Przeglądacza Turniejowego ma zrobić. Formularz wyświetla:

  • Nazwę turnieju

  • Rozwijana lista zawierająca rundy turnieju

  • Pole listy pokazujące dopasowania dla wybranej rundy

  • Nazwy zespołów i punkty dla wybranego dopasowania

Tim podkreśla, że wszystkie te informacje muszą być zsynchronizowane. Gdy zmienia się runda, dopasowania muszą się uaktualniać. Gdy zmienia się dopasowanie, nazwy zespołów i punkty muszą się uaktualniać. To wymaganie napędza całą dyskusję wokół wiązania danych. Kontrolki powiązane z tym samym źródłem danych, znane również jako powiązane kontrolki danych, pozostają zsynchronizowane automatycznie. Kontrolka BindingNavigator obsługuje wiązanie do danych, utrzymując wskaźnik na obecnym elemencie w liście rekordów. Klasa CurrencyManager zarządza kolekcją wiązań między kontrolkami listowymi a obiektem źródła danych, umożliwiając śledzenie pozycji i powiadomienia o zmianach. Każda kontrolka powiązana, taka jak TextBox lub Label, jest połączona z źródłem danych za pośrednictwem tych mechanizmów, aby zapewnić automatyczną synchronizację.

Przekazanie Obiektu Turnieju do Formularza

Tim wyjaśnia, że formularz Przeglądacza Turniejowego nie powinien decydować, który turniej załadować. Odpowiedzialność za to spoczywa na tablicy rozdzielczej. Dlatego formularz Przeglądacza Turniejowego musi otrzymać TournamentModel poprzez swój konstruktor.

Pokazuje, jak przekazywany obiekt turnieju jest przechowywany w prywatnym polu na poziomie formularza, dzięki czemu jest dostępny dla każdej metody w formularzu. Ten obiekt turnieju staje się jedynym źródłem prawdy dla wszystkich operacji wiązania danych. W prostym wiązaniu danych, kontrolka może być powiązana z pojedynczym elementem danych, takim jak wartość z jednej tabeli danych, pozwalając wyświetlać lub edytować pojedyncze punkty danych. BindingSource moze byc uzywany w sytuacjach zarowno prostych, jak i zlozonych powiazan.

Metoda Załaduj Dane Formularza

Tim wprowadza prywatną metodę o nazwie LoadFormData. Ta metoda pobiera dane z modelu turnieju i wrzuca je do kontrolek UI.

Na przykład:

  • Etykieta nazwy turnieju otrzymuje swoją wartość bezpośrednio z tournament.TournamentName. To wiąże się z ustawieniem właściwości kontrolki, takiej jak właściwość tekstowa kontrolki pola tekstowego, na wartość z źródła danych.

Tim zwraca uwagę, że jest to najprostsza forma wiązania danych—ręczne przypisywanie wartości—i jest to dobry punkt wyjścia przed zajmowaniem się listami i kolekcjami. Proste wiązanie łączy pojedynczą właściwość kontrolki z pojedynczą wartością w źródle danych i zazwyczaj wyświetla jeden rekord na raz.

Podlączenie Przycisku Tablicy Rozdzielczej

Tim przeprowadza modyfikacje tablicy rozdzielczej, aby po wybraniu turnieju przez użytkownika i kliknięciu "Załaduj Turniej", otwieraĺ się formularz Przeglądacza Turniejowego.

Tutaj Tim przekształca wybrany element rozwijalny na TournamentModel i przekazuje go do formularza przeglądarki. Potwierdza działanie połączenia, uruchamiając aplikację i widząc, że nazwa turnieju pojawia się poprawnie.

To potwierdza, że podstawowe przekazywanie obiektów i aktualizacje UI działają, zanim przejdziemy do wiązania listy.

Ładowanie Rund do Rozwijanej Listy z Źródła Danych

Teraz Tim przechodzi do wiązania listy, zaczynając od rund turniejowych.

Wyjasnia, ze rundy najlepiej przedstawia się jako listę całkowitych, a nie ciągów. Tim wyraźnie mówi, że ten wybór ułatwia życie, ponieważ:

  • Całkowite dobrze wiążą się z rozwijalnymi listami

  • Liczby calkowite mogą być pobierane bez parsowania jako ciagi

  • Wybrana wartosc może być bezposrednio rzutowana spowrotem na int

Kontrolka ComboBox może być powiazana z dana tabela lub lista, umozliwiajac efektywne wyswietlanie i wybieranie danych. Podczas wiazania kontrolki ComboBox można użyć wlasciwosci DisplayMember, aby okreslic, które pole jest pokazywane użytkownikowi, oraz wlasciwosci ValueMember, aby okreslic, które pole jest używane jako wartosc bazowa. Podobnie można wiazac kontrolke DataGridView z informacjami zawartymi w tabeli danych.

Tim przechodzi przez rundy turnieju, wyciaga unikalne numery rund i przechowuje je na liscie.

Laczenie listy rozwijanej rund z wiazaniem danych

Tim przedstawia pierwsza wazna zasade wiazania w WinForms:

Zawsze ustawiaj zródlo danych na null przed jego zresetowaniem.

Czyści zródlo danych listy rozwijanej, a następnie przypisuje do niej liste rund. Gdy wiazesz kontrolke z zródlem danych, jesli zródlo danych implementuje interfejsy, takie jak INotifyCollectionChanged, kontrolka automatycznie odswieża swoj interfejs uzytkownika po zmianie danych. To zapewnia synchronizacje w czasie rzeczywistym między danymi a ich wizualna reprezentacja. Dodatkowo zmiany w kontrolce UI lub w bazowym zródle danych automatycznie aktualizuja drugi koniec wiazania na podstawie konfiguracji (jednostronne lub dwustronne). Poniewaz liczby calkowite naturalnie zamieniaja sie na ciagi, wyjasnia, ze nie jest tu wymagane żadne DisplayMember.

Następnie Tim pokazuje czesty blad — zapomnienie o wywolaniu metody ładowania — i pokazuje, jak brak jednej metody skutkuje pusta lista rozwijana.

Zdarzenia SelectedIndexChanged i dynamiczne aktualizacje

Tim wyjasnia, ze WinForms opiera sie w dużej mierze na zdarzeniach, szczególnie SelectedIndexChanged.

Podlacza zdarzenie SelectedIndexChanged listy rozwijanej rund do metody, która laduje pary meczowe dla wybranej rundy. Wiazanie danych w WinForms obejmuje handler zdarzen, który otrzymuje parametr sender obiektu, identyfikujac, która kontrolka wywolala zdarzenie. Można obsługiwac następujace zdarzenia, jak Format i Parse, aby dostosowac formatowanie i walidacje danych; zdarzenia Format i Parse klasy Binding umozliwiaja specjalne formatowanie i walidacje danych podczas procesu wiazania danych. Inne kontrolki mogą również być wiażane i synchronizowane za pomoca podobnej obsługi zdarzeń.

Tim woli wyodrebniac logike do prywatnych metod pomocniczych zamiast umieszczac kod bezposrednio w obsludze zdarzeń. Wyjasnia, ze to sprawia, ze kod jest ponownie uzywalny i czysty.

Ladowanie par meczowych na podstawie wybranej rundy

Tim pobiera wybrana runde, rzutujac wybrany element listy rozwijanej z powrotem na liczbe calkowita.

Ponownie przechodzi przez rundy turnieju, ale tym razem filtruje pary, w których runda matches jest rowna wybranej rundzie. Te pary sa umieszczane na liscie wybranych par, która staje sie zródlem danych dla listy par.

To wprowadza wyzwanie wiazania list złożonych obiektów.

Tworzenie wlasciwosci Display do wiazania

Tim wyjasnia, ze model pary nie ma naturalnej reprezentacji ciagów nadajacej się do wyswietlania w UI.

Zamiast wymuszać logike w UI, Tim dodaje wlasciwość DisplayName do modelu tylko do odczytu. Ta wlasciwość buduje ciag taki jak:

Drużyna A kontra Drużyna B

Jesli druzyna brakuje (runda bez rywala lub przyszla runda), Tim zwraca:

Pojedynek jeszcze nie ustalony

Złożone wiązane kontrolki, takie jak DataGridView, obsługuja złożone scenariusze wiazania, gdzie można wyświetlac i edytowac wiele elementów danych z tabeli danych lub innych struktur. Złożone wiazanie danych umozliwia wiazanie wiecej niż jednego elementu danych z kontrolka, takich jak wiazanie wielu kolumn lub wierszy z bazowego zródla rekordów. ADO.NET oferuje wiele struktur danych odpowiednich do wiazania, w tym DataTable, DataView i inne struktury, a Windows Forms wspiera wiazanie do wielu zródeł danych. Klasa binding zarzadza logicznym powiazaniem między polami zródła danych a wlasciwosciami kontrolki, a interfejsy takie jak IBindingList, IEditableObject i INotifyPropertyChanged zapewniaja sortowanie, powiadamianie o zmianach oraz wsparcie dla cofania. Możesz ustawiac domyslne filtry na widokach danych, aby kontrolowac, jak dane sa wyswietlane, a kontekst wiazania i CurrencyManager ostatecznie okreslaja synchronizacje kontrol dwiiiazanych do danych. Wlasciwosc BindingContext formularza Windows zarzadza obiektami CurrencyManager dla formularza, a każde zródlo danych ma pojedynczy obiekt CurrencyManager, który utrzymuje synchronizacje pomiedzy wszystkimi kontrolkami zwiazanymi z tym samym zródlem danych. W Windows Forms można tworzyć własne kontrolki, które zachowuja sie jak standardowe kontrolki wiazane do danych, implementujac niezbedne interfejsy wiazania danych.

To jest kluczowa zasada wiazania danych w WinForms, na której Tim kładzie nacisk:

Model powinien decydować, jak się wyświetla – nie UI.

Debugowanie bledów wiazania

Tim napotyka wiele bledów:

  • Runda druga nie wyswietla sie poprawnie

  • Pary meczowe nie odświeżają się

  • Zdarzenia wyzwalaja się niespodziewanie

Zamiast ukrywać te problemy, Tim przechodzi przez każdy krok debugowania. Wyjaśnia, jak wiazanie pęka, gdy listy sa zastepowane, nawet jesli nowa lista zawiera poprawne dane.

To prowadzi do kluczowej lekcji z WinForms.

Poniższy kod pokazuje, jak obsługiwać zdarzenia Format i Parse klasy Binding, aby udostepnic specjalne formatowanie i walidacje danych podczas procesu wiazania danych. Zdarzenia Format i Parse można użyć, aby dostosowac, jak dane sa konwertowane i walidowane miedzy UI a zródłem danych.

BindingSource versus BindingList w Wiazaniu Danych Windows Forms

Tim eksperymentuje z BindingSource, umieszczajac je między kontrolka UI a danymi. Wyjaśnia, jak to było kiedyś zalecanym podejściem, ale przyznaje, że wprowadza złożoność i zamieszanie. Komponent BindingSource działa jako pełnomocnik między zródłem danych i kontrolkami Windows Forms i współpracuje z różnymi strukturami danych odpowiednimi do wiazania, takimi jak DataTables, DataViews, BindingLists i tablice.

Następnie wprowadza BindingList, wyjaśniajac, że automatycznie aktualizuje wiązane kontrolki, gdy lista sie zmienia. Jeśli zródlo danych implementuje odpowiednie interfejsy, jak INotifyCollectionChanged, wiazanie danych w Windows Forms wspiera automatyczne aktualizacje kontrolek po zmianie bazowych danych.

Jednak Tim odkrywa kluczową zasadę:

Nie wolno zastępować BindingList nową.

Zamiast tego musisz:

  • Wyczysc istniejacą BindingList

  • Dodać do niej ponownie elementy

Zastępowanie listy łamie połączenie wiazanie.

Naprawianie przerwanego wiazania przez czyszczenie list

Tim potwierdza główną przyczynę problemu wiazania:

  • Przypisanie nowej BindingList() powoduje odłączenie interfejsu użytkownika

  • Czyści i ponownie dodaje elementy, zachowuje wiazanie

Aktualizuje zarówno rundy, jak i pary meczowe, aby używać tego wzorca. Gdy zostanie zastosowany konsekwentnie, UI wreszcie aktualizuje sie poprawnie.

Ręczne ładowanie poczatkowych wyborów

Tim wyjaśnia, że WinForms nie wyzwala automatycznie wyrażenia SelectedIndexChanged, gdy elementy sa ładowane.

Aby to naprawić, ręcznie:

  • Laduje pary meczowe dla rundy 1 po załadowaniu rund

  • Programowo wybiera pierwszą parę meczową

To zapewnia, że UI inicjuje się poprawnie, bez wymagania interakcji użytkownika.

Ostateczny efekt i podsumowanie lekcji

Na koniec lekcji Tim potwierdza:

  • Rundy aktualizuja sie poprawnie

  • Pary meczowe aktualizuja się poprawnie

  • Nazwy druzyn i wyniki ładuja się poprawnie

  • Wolne tygodnie i przyszle rundy wyświetlaja wartosciowe teksty

Podkreśla, że ta lekcja nie dotyczyła doskonałości, ale zrozumienia, jak WinForms wiazanie danych naprawdę działa – w tym jego ograniczenia.

Tim kończy, wyjaśniając, że ocena skoringu i filtrowanie (jak "tylko nie rozegrane") będą obsługiwane w następnej lekcji, gdy będzie można pracować z realistycznymi zmianami stanu.

Refleksje końcowe

Lekcja 22 to mistrzowska klasa praktycznego wiazania danych w WinForms, nie dlatego, że wszystko działa gładko, ale dlatego, że Tim Corey przechodzi przez każdy błąd, naprawę i decyzję projektową w czasie rzeczywistym.

Śledząc wideo Tima, programiści uzyskają realistyczne zrozumienie:

  • Dlaczego wiazanie w WinForms wydaje się niepewne

  • Jak działa BindingList

  • Dlaczego czyszczenie list jest ważne

  • Jak UI i modele powinny współdziałać

Jeśli kiedykolwiek zastanawiałeś się nad wiazaniem danych w WinForms, ta lekcja – i wyjaśnienia Tima – sprawiają, że w końcu się to "kliknie".

Hero Worlddot related to Wiązanie Danych WinForms Wyjaśnione Przez Tima Coreya przez Viewer Turnieju
Hero Affiliate related to Wiązanie Danych WinForms Wyjaśnione Przez Tima Coreya przez Viewer Turnieju

Zarabiaj więcej, dzieląc się tym, co kochasz

Tworzysz treści dla deweloperów pracujących z .NET, C#, Java, Python, czy Node.js? Zamień swoją wiedzę specjalistyczną na dodatkowy dochód!

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie