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
46m 06s
W tym artykule, idąc za Lekcją 13 "C# App Start to Finish" Tima Coreya, przyjrzymy się bliżej rozwojowi aplikacji C#. Tim przeprowadza nas przez proces budowy funkcjonalnej aplikacji Windows Forms, koncentrując się na tym, jak połączyć elementy kontrolne UI, takie jak comboboxy, listboxy i przyciski z danymi. Ta lekcja demonstruje kluczowe koncepty, takie jak powiązanie danych, zarządzanie listami, łączność z bazą danych przy użyciu Dappera oraz podstawową walidację i debugowanie, umiejętności niezbędne do budowania rzeczywistych aplikacji C#.
Tim zaczyna, przypominając nam, że Lekcja 13 jest kontynuacją poprzedniego wideo, w którym połączono sekcję "Add New Member". W tej lekcji Tim wyjaśnia, że głównym celem jest połączenie rozwijanej listy (combobox) i listboxa, a następnie powiązać nowo utworzony obiekt osoby, aby pojawiał się na liście. Tim jasno określa plan: ta lekcja skupi się na łączeniu UI, przemieszczeniu danych i synchronizacji list — fundamentalne aspekty budowy aplikacji desktopowej w C#.
Tim wyjaśnia, że za rozwijaną listą i listboxem znajduje się lista obiektów Person. To klasyczny przykład powiązania danych w Windows Forms, gdzie elementy interfejsu są powiązane z kolekcjami modeli danych.
Tworzy dwie prywatne listy na poziomie klasy:
availableTeamMembers – osoby, które mogą być dodane do zespołu
selectedTeamMembers – osoby już dodane do zespołu
Tim wyjaśnia oczekiwane działanie: gdy osoba zostanie wybrana z rozwijanej listy i dodana, powinna przejść z availableTeamMembers do selectedTeamMembers. To standardowy wzorzec CRUD w rozwoju aplikacji desktopowych, gdzie UI odzwierciedla dane źródłowe.
Tim odpowiada na częste pytanie projektowe: "Dlaczego nie ograniczyć członków zespołu na podstawie turnieju?". Wyjaśnia, że formularz Create Team nie jest bezpośrednio powiązany z turniejem, a wiele turniejów może odbywać się jednocześnie.
Tim używa praktycznego przykładu: jeśli jednocześnie odbywa się turniej koszykówki i ping-ponga, osoba może brać udział w obu. Ograniczenie rozwijanej listy wymagałoby złożonej logiki i mogłoby wprowadzić błędy. Zamiast tego Tim wybiera prostsze podejście:
To podejście demonstruje praktyczną decyzję projektową oprogramowania: unikać nadmiernej komplikacji, gdy nie jest to konieczne.
Tim tworzy metodę o nazwie WireUpLists, aby połączyć listy z kontrolkami UI. Ta metoda wiąże listę availableTeamMembers z comboboxem i listę selectedTeamMembers z listboxem.
Tim zwraca uwagę na kluczową poprawę: w nowoczesnych Windows Forms można bezpośrednio wiązać listy z kontrolkami bez użycia oddzielnego BindingSource. To przydatna wskazówka dla programistów pracujących nad wiązaniem danych w Windows Forms.
Tim wyjaśnia, że w comboboxie musi być wyświetlana czytelna nazwa. Właściwość DisplayMember oczekuje na właściwość string z modelu Person. Tim ostrzega, że użycie tylko FirstName lub LastName może powodować duplikaty.
Dlatego Tim tworzy właściwość tylko-odczytu o nazwie FullName:
public string FullName
{
get
{
return "{FirstName} {LastName}";
}
}
To demonstruje ważną praktykę UI: zawsze upewnij się, że twój UI wyświetla przyjazne użytkownikowi informacje, a nie surowe dane obiektu.
Tim tworzy metodę o nazwie CreateSampleData do testowania list i UI. Dodaje przykładowe obiekty Person do obu list i wywołuje WireUpLists w konstruktorze.
To przydatna technika do szybkiego budowania i testowania aplikacji Windows Forms przed połączeniem z rzeczywistą bazą danych.
Tim komentuje przykładowe dane i przygotowuje się do załadowania rzeczywistych danych. Dodaje metodę GetPerson_All do interfejsu IDataConnection. Tim wyjaśnia swoją konwencję nazewnictwa:
Create = wstaw
Get = wybierz
To standardowa strategia nazewnictwa dla warstw dostępu do danych w aplikacjach C#.
Tim implementuje wersję SQL GetPerson_All przy użyciu Dappera i procedury przechowywanej:
connection.Query<PersonModel>("spPeople_GetAll").ToList();
Tim celowo używa zmiennej wyjściowej zamiast bezpośredniego zwrócenia, aby ułatwić debugowanie. To pokazuje, jak praktyki debugowania mogą wpływać na projekt kodu.
Tim zauważa powtarzające się nazwy ciągów połączeń i zmienia je na stałą. Wyjaśnia, że powtórzenie jest złą praktyką i może powodować błędy później.
To ważna zasada inżynierii oprogramowania: DRY (Don't Repeat Yourself).
Tim tworzy LoadListData() i wypełnia availableTeamMembers przy użyciu GetPerson_All(). Lista selectedTeamMembers pozostaje pusta, co jest właściwe, ponieważ nowy zespół zaczyna się pusty.
To pokazuje, jak połączyć UI z rzeczywistymi źródłami danych, czy to bazą danych, czy plikiem tekstowym.
Tim tworzy obsługę zdarzeń przycisku Add Member. Logika jest:
Pobierz wybraną osobę z rozwijanej listy
Usuń ją z dostępnej listy
Dodaj ją do wybranej listy
Odśwież interfejs użytkownika
Tim wyjaśnia, że wybrany element musi być rzutowany na PersonModel, ponieważ pole kombi przechowuje obiekty jako object. To podkreśla znaczenie rzutowania typów i obsługi obiektów w C#.
Tim odkrywa, że interfejs użytkownika nie odświeża się po przeniesieniu elementów. Po debugowaniu znajduje rozwiązanie:
Ustaw DataSource na null
Następnie ponownie przypisz listę
To wymusza odświeżenie pola kombi i pola z listą. Tim podkreśla, że umiejętności debugowania są niezbędne i często wymagane do zrozumienia, jak zachowuje się powiązanie danych.
Tim zmienia nazwę przycisku na Usuń Wybrane i tworzy obsługę zdarzenia. To odwraca operację dodawania:
Usuń z selectedTeamMembers
Dodaj z powrotem do availableTeamMembers
Odśwież interfejs użytkownika
Tim odkrywa błąd: jeśli żaden element nie jest wybrany, dodawana jest wartość null. Dodaje walidację:
if (p != null)
{
// kontynuuj
}
To demonstruje podstawową walidację i zapobieganie błędom.
Tim podkreśla testowanie aplikacji jako użytkownika, który próbuje ją zepsuć. Radzi mieć testerów, którzy celowo próbują zepsuć aplikację, ponieważ prawdziwi użytkownicy będą wykonywać nieoczekiwane działania.
To kluczowa lekcja dla budowania niezawodnego oprogramowania.
Tim modyfikuje przycisk "Utwórz Członka", aby zapisać nową osobę w magazynie danych i natychmiast dodać ją do wybranej listy. To pokazuje, jak wdrożyć operacje CRUD w aplikacji Windows Forms.
Tim zdaje sobie sprawę, że brak wersji plikowej GetPerson_All. Wdraża go za pomocą prostego wiersza:
return PeopleFile.FullFilePath.LoadFile().ConvertToPersonModels();
To pokazuje, że przechowywanie na podstawie plików można łatwo wdrożyć bez skomplikowanej logiki.
Tim uruchamia aplikację i potwierdza, że teraz dropdown ładuje ludzi z pliku tekstowego i bazy danych. Dodaje nowych ludzi i widzi, jak pojawiają się natychmiast, pokazując, że cały system działa poprawnie.
Tim kończy, stwierdzając, że następne wideo skupi się na tworzeniu samego zespołu. To obejmuje zapisanie wielu fragmentów danych do bazy danych lub pliku tekstowego, uzupełniając funkcję.
Lekcja 13 Tima Coreya Lekcja 13 to rzeczywisty przykład rozwoju aplikacji Windows Forms w C#. Od podłączania kontrolek interfejsu użytkownika i powiązania danych po debugowanie i walidację, Tim uczy praktycznych umiejętności programowania do budowania prawdziwych aplikacji desktopowych. Ta lekcja jest szczególnie wartościowa dla programistów, którzy chcą uczyć się powiązania danych, Dappera, operacji CRUD w SQL i programowania z napędem UI w C#.
Jeśli chcesz kontynuować naukę, następna lekcja Tima zakończy funkcję tworzenia zespołu i połączy wszystko w działającą aplikację.
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