Udostępnij za pośrednictwem


Omówienie powiązania danych (Windows Forms .NET)

W formularzach Windows Forms można powiązać nie tylko z tradycyjnymi źródłami danych, ale także z niemal dowolną strukturą zawierającą dane. Można powiązać z tablicą wartości obliczanych w czasie wykonywania, odczytywać z pliku lub pochodzić z wartości innych kontrolek.

Ponadto można powiązać dowolną właściwość dowolnej kontrolki ze źródłem danych. W tradycyjnym powiązaniu danych zazwyczaj powiązana jest właściwość wyświetlania — na przykład Text właściwość kontrolki TextBox — ze źródłem danych. W przypadku platformy .NET można również ustawić inne właściwości za pomocą powiązania. Aby wykonać następujące zadania, możesz użyć powiązania:

  • Ustawianie grafiki kontrolki obrazu.

  • Ustawianie koloru tła co najmniej jednej kontrolki.

  • Ustawianie rozmiaru kontrolek.

Zasadniczo powiązanie danych jest automatycznym sposobem ustawiania dowolnej właściwości dostępnej w czasie wykonywania dowolnej kontrolki w formularzu.

ADO.NET umożliwia tworzenie wielu różnych struktur danych w celu dopasowania ich do potrzeb związanych z aplikacją i danymi, z którymi pracujesz. Możesz utworzyć własne klasy, które udostępniają lub zużywają dane w formularzach Systemu Windows. Te obiekty mogą oferować różne poziomy funkcjonalności i złożoności. Od podstawowego powiązania danych po zapewnienie obsługi czasu projektowania, sprawdzania błędów, powiadamiania o zmianie, a nawet obsługi strukturalnych wycofywania zmian wprowadzonych w samych danych.

Odbiorcy interfejsów powiązań danych

W poniższych sekcjach opisano dwie grupy obiektów interfejsu. Pierwsza grupa interfejsu jest implementowana w źródłach danych przez autorów źródeł danych. Odbiorcy źródła danych, tacy jak kontrolki lub składniki systemu Windows Forms, implementują te interfejsy. Druga grupa interfejsu jest przeznaczona do używania przez autorów składników. Autorzy składników używają tych interfejsów podczas tworzenia składnika obsługującego powiązanie danych, które mają być używane przez aparat powiązania danych formularzy systemu Windows. Te interfejsy można zaimplementować w klasach skojarzonych z formularzem, aby umożliwić powiązanie danych. Każdy przypadek przedstawia klasę, która implementuje interfejs, który umożliwia interakcję z danymi. Narzędzia do projektowania danych szybkiego tworzenia aplikacji (RAD) programu Visual Studio już korzystają z tej funkcji.

Interfejsy implementacji przez autorów źródeł danych

Kontrolki Windows Forms implementują następujące interfejsy:

  • IList Interfejs

    Klasa, która implementuje IList interfejs, może być klasy Array, ArrayListlub CollectionBase. Są to indeksowane listy elementów typu Object , a listy muszą zawierać homogeniczne typy, ponieważ pierwszy element indeksu określa typ. IList będzie dostępna tylko w przypadku powiązania w czasie wykonywania.

    Uwaga

    Jeśli chcesz utworzyć listę obiektów biznesowych na potrzeby powiązania z formularzami systemu Windows, rozważ użycie elementu BindingList<T>. Jest BindingList to rozszerzalna klasa, która implementuje podstawowe interfejsy wymagane do dwukierunkowego powiązania danych formularzy systemu Windows.

  • IBindingList Interfejs

    Klasa, która implementuje IBindingList interfejs, zapewnia znacznie wyższy poziom funkcji powiązania danych. Ta implementacja oferuje podstawowe możliwości sortowania i powiadomienia o zmianie. Oba te elementy są przydatne, gdy elementy listy się zmieniają, a gdy sama lista się zmienia. Powiadomienie o zmianie jest ważne, jeśli planujesz mieć wiele kontrolek powiązanych z tymi samymi danymi. Ułatwia to wprowadzanie zmian danych wprowadzonych w jednej z kontrolek w celu propagowania ich do innych powiązanych kontrolek.

    Uwaga

    Powiadomienie o zmianie jest włączone dla interfejsu IBindingListSupportsChangeNotification za pośrednictwem właściwości, która, gdy true, zgłasza ListChanged zdarzenie, wskazując, że lista została zmieniona lub element na liście uległ zmianie.

    Typ zmiany jest opisywany przez ListChangedType właściwość parametru ListChangedEventArgs . W związku z tym za każdym razem, gdy model danych zostanie zaktualizowany, wszystkie widoki zależne, takie jak inne kontrolki powiązane z tym samym źródłem danych, również zostaną zaktualizowane. Jednak obiekty znajdujące się na liście będą musiały powiadomić listę po ich zmianie, aby lista mogła zgłosić ListChanged zdarzenie.

    Uwaga

    Element BindingList<T> zapewnia ogólną implementację interfejsu IBindingList .

  • IBindingListView Interfejs

    Klasa, która implementuje IBindingListView interfejs, zapewnia wszystkie funkcje implementacji IBindingListprogramu , wraz z filtrowaniem i zaawansowanymi funkcjami sortowania. Ta implementacja oferuje filtrowanie oparte na ciągach i sortowanie wielokolumna z parami kierunkowymi właściwości.

  • IEditableObject Interfejs

    Klasa, która implementuje IEditableObject interfejs, umożliwia obiektowi kontrolowanie, kiedy zmiany w tym obiekcie są trwałe. Ta implementacja BeginEditobsługuje metody , EndEditi CancelEdit , które umożliwiają wycofywanie zmian wprowadzonych w obiekcie. Poniżej przedstawiono krótkie wyjaśnienie funkcjonowania BeginEditmetod , EndEditi CancelEdit oraz sposobu ich współpracy ze sobą w celu umożliwienia ewentualnego wycofania zmian wprowadzonych w danych:

    • Metoda BeginEdit sygnalizuje rozpoczęcie edycji obiektu. Obiekt, który implementuje ten interfejs, będzie musiał przechowywać wszelkie aktualizacje po BeginEdit wywołaniu metody w taki sposób, że aktualizacje można odrzucić, jeśli CancelEdit metoda jest wywoływana. W przypadku powiązania danych Formularze systemu Windows można wywołać BeginEdit wiele razy w zakresie pojedynczej transakcji edycji (na przykład BeginEdit, , BeginEditEndEdit). Implementacje programu IEditableObject powinny śledzić, czy BeginEdit wywołano już metodę , i ignorować kolejne wywołania funkcji BeginEdit. Ponieważ ta metoda może być wywoływana wiele razy, ważne jest, aby kolejne wywołania do niej nie są destruktywne. Kolejne BeginEdit wywołania nie mogą zniszczyć aktualizacji, które zostały wprowadzone lub zmienić dane zapisane podczas pierwszego BeginEdit wywołania.

    • Metoda EndEdit wypycha wszelkie zmiany, które BeginEdit zostały wywołane do obiektu bazowego, jeśli obiekt jest obecnie w trybie edycji.

    • Metoda CancelEdit odrzuca wszelkie zmiany wprowadzone w obiekcie.

    Aby uzyskać więcej informacji na temat BeginEditsposobu działania metod , EndEditi CancelEdit , zobacz Zapisywanie danych z powrotem w bazie danych.

    To transakcyjne pojęcie funkcji danych jest używane przez kontrolkę DataGridView .

  • ICancelAddNew Interfejs

    Klasa, która implementuje ICancelAddNew interfejs, zwykle implementuje IBindingList interfejs i umożliwia wycofanie dodatku do źródła danych za AddNew pomocą metody . Jeśli źródło danych implementuje IBindingList interfejs, należy go również zaimplementować ICancelAddNew .

  • IDataErrorInfo Interfejs

    Klasa implementujący IDataErrorInfo interfejs umożliwia obiektom oferowanie niestandardowych informacji o błędach powiązanym kontrolkom:

    • Właściwość Error zwraca ogólny tekst komunikatu o błędzie (na przykład "Wystąpił błąd").

    • Właściwość Item[] zwraca ciąg z określonym komunikatem o błędzie z kolumny (na przykład "Wartość w State kolumnie jest nieprawidłowa").

  • IEnumerable Interfejs

    Klasa, która implementuje IEnumerable interfejs, jest zwykle zużywana przez ASP.NET. Obsługa formularzy systemu Windows dla tego interfejsu BindingSource jest dostępna tylko za pośrednictwem składnika.

    Uwaga

    Składnik BindingSource kopiuje wszystkie IEnumerable elementy do oddzielnej listy na potrzeby powiązania.

  • ITypedList Interfejs

    Klasa kolekcji, która implementuje ITypedList interfejs, udostępnia funkcję do kontrolowania kolejności i zestawu właściwości uwidocznionych dla powiązanej kontrolki.

    Uwaga

    Podczas implementowania GetItemProperties metody , a tablica PropertyDescriptor nie ma wartości null, ostatnim wpisem w tablicy będzie deskryptor właściwości opisujący właściwość listy, która jest inną listą elementów.

  • ICustomTypeDescriptor Interfejs

    Klasa, która implementuje ICustomTypeDescriptor interfejs, udostępnia dynamiczne informacje o sobie. Ten interfejs jest podobny do ITypedList interfejsu, ale jest używany dla obiektów, a nie list. Ten interfejs jest używany przez DataRowView program do projekcji schematu wierszy bazowych. Prosta implementacja ICustomTypeDescriptor elementu jest dostarczana przez klasę CustomTypeDescriptor .

    Uwaga

    Aby obsługiwać powiązanie czasu projektowania z typami, które implementują ICustomTypeDescriptor, typ musi również implementować IComponent i istnieć jako wystąpienie w formularzu.

  • IListSource Interfejs

    Klasa, która implementuje IListSource interfejs umożliwia powiązanie oparte na liście na obiektach innych niż listy. Metoda GetListIListSource metody służy do zwracania listy możliwej do powiązania z obiektu, który nie dziedziczy z IListklasy .IListSource jest używany przez klasę DataSet .

  • IRaiseItemChangedEvents Interfejs

    Klasa, która implementuje IRaiseItemChangedEvents interfejs, jest powiązaną listą, która implementuje IBindingList również interfejs. Ten interfejs służy do wskazywania, czy typ zgłasza ListChanged zdarzenia typu ItemChanged za pośrednictwem jego RaisesItemChangedEvents właściwości.

    Uwaga

    Należy zaimplementować, IRaiseItemChangedEvents jeśli źródło danych udostępnia właściwość , aby wyświetlić listę konwersji zdarzeń opisanych wcześniej i wchodzi w interakcję ze składnikiem BindingSource . BindingSource W przeciwnym razie właściwość będzie również wykonywać w celu wyświetlenia listy konwersji zdarzeń, co powoduje niższą wydajność.

  • ISupportInitialize Interfejs

    Składnik, który implementuje ISupportInitialize interfejs, wykorzystuje zalety optymalizacji wsadowej do ustawiania właściwości i inicjowania właściwości zależnych. Zawiera ISupportInitialize dwie metody:

    • BeginInit sygnalizuje, że inicjowanie obiektu jest uruchamiane.

    • EndInit sygnalizuje zakończenie inicjowania obiektu.

  • ISupportInitializeNotification Interfejs

    Składnik implementujący ISupportInitializeNotification interfejs implementuje ISupportInitialize również interfejs. Ten interfejs umożliwia powiadamianie innych ISupportInitialize składników o zakończeniu inicjowania. Interfejs ISupportInitializeNotification zawiera dwa elementy członkowskie:

  • INotifyPropertyChanged Interfejs

    Klasa, która implementuje ten interfejs, jest typem, który zgłasza zdarzenie, gdy dowolna z jego wartości właściwości ulegnie zmianie. Ten interfejs został zaprojektowany tak, aby zastąpić wzorzec zmiany zdarzenia dla każdej właściwości kontrolki. W przypadku użycia w obiekcie BindingList<T>biznesowym obiekt biznesowy powinien implementować INotifyPropertyChanged interfejs, a klasa BindingList'1 konwertuje PropertyChanged zdarzenia na ListChanged zdarzenia typu ItemChanged.

    Uwaga

    Aby powiadomienie o zmianie odbywało się w powiązaniu między powiązanym klientem a źródłem danych, powiązany typ źródła danych powinien implementować INotifyPropertyChanged interfejs (preferowany) lub można podać zdarzenia propertyNameChanged dla typu powiązanego, ale nie należy wykonywać obu tych czynności.

Interfejsy implementacji przez autorów składników

Następujące interfejsy są przeznaczone do użycia przez aparat powiązania danych windows Forms:

  • IBindableComponent Interfejs

    Klasa, która implementuje ten interfejs, jest składnikiem niekontroli obsługującym powiązanie danych. Ta klasa zwraca powiązania danych i kontekst powiązania składnika za pomocą DataBindings właściwości i BindingContext tego interfejsu.

    Uwaga

    Jeśli składnik dziedziczy z Controlklasy , nie musisz implementować interfejsu IBindableComponent .

  • ICurrencyManagerProvider Interfejs

    Klasa, która implementuje ICurrencyManagerProvider interfejs, jest składnikiem, który udostępnia własne CurrencyManager do zarządzania powiązaniami skojarzonymi z tym konkretnym składnikiem. Dostęp do obiektu niestandardowego CurrencyManager jest dostarczany przez CurrencyManager właściwość .

    Uwaga

    Klasa dziedziczona po Control powiązaniach zarządzanych automatycznie za pośrednictwem jej BindingContext właściwości, więc przypadki, w których należy zaimplementować klasę ICurrencyManagerProvider , są dość rzadkie.

Źródła danych obsługiwane przez formularze systemu Windows

Tradycyjnie powiązanie danych jest używane w aplikacjach do korzystania z danych przechowywanych w bazach danych. Dzięki powiązaniu danych formularzy systemu Windows można uzyskiwać dostęp do danych z baz danych i danych w innych strukturach, takich jak tablice i kolekcje, tak długo, jak zostały spełnione określone minimalne wymagania.

Struktury do powiązania z

W formularzach systemu Windows można powiązać z szeroką gamą struktur — od prostych obiektów (proste powiązanie) do złożonych list, takich jak tabele danych ADO.NET (złożone powiązanie). W przypadku prostego powiązania formularze systemu Windows obsługują powiązanie z właściwościami publicznymi w obiekcie prostym. Powiązanie oparte na liście formularzy systemu Windows zwykle wymaga, aby obiekt obsługiwał IList interfejs lub IListSource interfejs. Ponadto w przypadku powiązania za pomocą BindingSource składnika można powiązać z obiektem obsługującym IEnumerable interfejs.

Na poniższej liście przedstawiono struktury, z które można powiązać w formularzach systemu Windows.

  • BindingSource

    A BindingSource jest najczęściej używanym źródłem danych formularzy systemu Windows i pełni rolę serwera proxy między źródłem danych a kontrolkami Windows Forms. Ogólny BindingSource wzorzec użycia polega na powiązaniu kontrolek z kontrolkami BindingSource i powiązaniu ze BindingSource źródłem danych (na przykład tabeli danych ADO.NET lub obiektu biznesowego). Zapewnia BindingSource usługi, które umożliwiają i zwiększają poziom obsługi powiązań danych. Na przykład kontrolki oparte na listach formularzy systemu Windows, takie jak DataGridView i ComboBox nie obsługują bezpośrednio powiązania IEnumerable ze źródłami danych, można jednak włączyć ten scenariusz przez powiązanie za pomocą elementu BindingSource. W takim przypadku BindingSource obiekt przekonwertuje źródło danych na IList.

  • Proste obiekty

    Formularze systemu Windows obsługują właściwości kontrolki powiązania danych do właściwości publicznych w wystąpieniu obiektu przy użyciu Binding typu . Formularze systemu Windows obsługują również kontrolki oparte na listach powiązań, takie jak do ListControl wystąpienia obiektu, gdy BindingSource jest używany.

  • Tablica lub kolekcja

    Aby działać jako źródło danych, lista musi zaimplementować IList interfejs. Jednym z przykładów jest tablica, która jest wystąpieniem Array klasy. Aby uzyskać więcej informacji na temat tablic, zobacz How to: Create an Array of Objects (Visual Basic)( Jak utworzyć tablicę obiektów (Visual Basic).

    Ogólnie rzecz biorąc, należy użyć BindingList<T> podczas tworzenia list obiektów dla powiązania danych. BindingList jest ogólną wersją interfejsu IBindingList . Interfejs IBindingList rozszerza IList interfejs przez dodanie właściwości, metod i zdarzeń niezbędnych do powiązania danych dwukierunkowych.

  • IEnumerable

    Kontrolki Formularzy systemu Windows mogą być powiązane ze źródłami danych, które obsługują IEnumerable interfejs tylko wtedy, gdy są one powiązane za pośrednictwem BindingSource składnika.

  • ADO.NET obiektów danych

    ADO.NET zapewnia wiele struktur danych odpowiednich do powiązania. Każda z nich różni się w swojej wyrafinowaniu i złożoności.

    • DataColumn

      Element to DataColumn podstawowy blok konstrukcyjny obiektu DataTable, w ramach którego wiele kolumn składa się z tabeli. Każda DataColumn z nich ma DataType właściwość, która określa rodzaj danych przechowywanych w kolumnie (na przykład tworzenie samochodów w tabeli opisującej samochody). Kontrolkę (na przykład TextBox właściwość kontrolki Text ) można powiązać z kolumną w tabeli danych.

    • DataTable

      A DataTable to reprezentacja tabeli z wierszami i kolumnami w ADO.NET. Tabela danych zawiera dwie kolekcje: DataColumn, reprezentującą kolumny danych w danej tabeli (które ostatecznie określają rodzaje danych, które można wprowadzić w tej tabeli) i DataRow, reprezentując wiersze danych w danej tabeli. Kontrolkę zawartą w tabeli danych można powiązać ze złożonym powiązaniem z informacjami (takimi jak powiązanie kontrolki DataGridView z tabelą danych). Jednak po powiązaniu z elementem DataTable, jest to powiązanie z domyślnym widokiem tabeli.

    • DataView

      A DataView to dostosowany widok pojedynczej tabeli danych, która może być filtrowana lub sortowana. Widok danych to "migawka" danych używana przez złożone kontrolki powiązane. Możesz powiązać dane w widoku danych z prostym lub złożonym powiązaniem, ale pamiętaj, że wiążesz się ze stałym "obrazem" danych, a nie czystym, aktualizując źródło danych.

    • DataSet

      A DataSet to kolekcja tabel, relacji i ograniczeń danych w bazie danych. Możesz powiązać proste lub złożone powiązanie z danymi w zestawie danych, ale pamiętaj, że łączysz się z wartością domyślną DataViewManager elementu DataSet (zobacz następny punktor).

    • DataViewManager

      Element A DataViewManager to dostosowany widok całego DataSetobiektu , analogiczny do elementu DataView, ale z uwzględnionych relacji. W kolekcji DataViewSettings można ustawić domyślne filtry i opcje sortowania dla wszystkich widoków, które DataViewManager mają dla danej tabeli.

Typy powiązań danych

Formularze systemu Windows mogą korzystać z dwóch typów powiązań danych: prostego powiązania i złożonego powiązania. Każda z nich oferuje różne korzyści.

Typ powiązania danych opis
Proste powiązanie danych Możliwość powiązania kontrolki z pojedynczym elementem danych, takim jak wartość w kolumnie w tabeli zestawu danych. Proste powiązanie danych to typ powiązania typowego dla kontrolek, takich jak kontrolka TextBox lub Label kontrolka, które są kontrolkami, które zwykle wyświetlają tylko jedną wartość. W rzeczywistości każda właściwość kontrolki może być powiązana z polem w bazie danych. W programie Visual Studio dostępna jest szeroka obsługa tej funkcji.

Aby uzyskać więcej informacji, zobacz Nawigowanie po danych i Tworzenie prostej kontrolki (Windows Forms .NET).
Złożone powiązanie danych Możliwość powiązania kontrolki z więcej niż jednym elementem danych, zazwyczaj więcej niż jeden rekord w bazie danych. Powiązanie złożone jest również nazywane powiązaniem opartym na liście. Przykłady kontrolek obsługujących złożone powiązanie to kontrolki DataGridView, ListBoxi ComboBox . Aby zapoznać się z przykładem złożonego powiązania danych, zobacz How to: Bind a Windows Forms ComboBox or ListBox Control to Data (Instrukcje: wiązanie kontrolki ComboBox lub ListBox formularzy systemu Windows z danymi).

Powiązanie składnika źródłowego

Aby uprościć powiązanie danych, formularze systemu Windows umożliwiają powiązanie źródła danych ze składnikiem BindingSource , a następnie powiązanie kontrolek z elementem BindingSource. W prostych lub złożonych scenariuszach powiązań można użyć BindingSource . W obu przypadkach BindingSource , działa jako pośrednik między źródłem danych i powiązanymi mechanizmami kontroli zapewniającymi zarządzanie walutą powiadomień o zmianie i innymi usługami.

Typowe scenariusze wykorzystujące powiązanie danych

Prawie każda aplikacja komercyjna używa informacji odczytywanych ze źródeł danych jednego typu lub innego, zwykle za pośrednictwem powiązania danych. Na poniższej liście przedstawiono kilka najbardziej typowych scenariuszy, które wykorzystują powiązanie danych jako metodę prezentacji i manipulowania danymi.

Scenariusz opis
Raportowanie Raporty zapewniają elastyczny sposób wyświetlania i podsumowywania danych w wydrukowanym dokumencie. Często tworzy się raport, który drukuje wybraną zawartość źródła danych na ekranie lub na drukarce. Typowe raporty obejmują listy, faktury i podsumowania. Elementy są sformatowane w kolumny list z podwitrykami zorganizowanymi w każdym elemencie listy, ale należy wybrać układ, który najlepiej odpowiada danym.
Wprowadzanie danych Typowym sposobem wprowadzania dużych ilości powiązanych danych lub monitowania użytkowników o informacje jest formularz wprowadzania danych. Użytkownicy mogą wprowadzać informacje lub wybierać opcje przy użyciu pól tekstowych, przycisków opcji, list rozwijanych i pól wyboru. Informacje są następnie przesyłane i przechowywane w bazie danych, której struktura jest oparta na wprowadzonych informacjach.
Relacja wzorca/szczegółów Aplikacja wzorca/szczegółów to jeden format do wyszukiwania powiązanych danych. W szczególności istnieją dwie tabele danych z relacją łączącą się w klasycznym przykładzie biznesowym, tabelę "Customers" i tabelę "Orders" z relacją między nimi łączącymi klientów i ich odpowiednimi zamówieniami. Aby uzyskać więcej informacji na temat tworzenia aplikacji master/detail z dwoma kontrolkami formularzy systemu Windows, zobacz Instrukcje: tworzenie formularza wzorca/szczegółów przy użyciu dwóch kontrolek DataGridView formularzy systemu Windows DataGridView
Tabela odnośników Innym typowym scenariuszem prezentacji/manipulowania danymi jest odnośnik do tabeli. Często w ramach większego wyświetlania danych kontrolka ComboBox służy do wyświetlania i manipulowania danymi. Kluczem jest to, że dane wyświetlane w kontrolce ComboBox różnią się od danych zapisanych w bazie danych. Jeśli na przykład masz kontrolkę ComboBox wyświetlającą elementy dostępne w sklepie spożywczym, prawdopodobnie chcesz zobaczyć nazwy produktów (chleb, mleko, jaja). Jednak w celu ułatwienia pobierania informacji w bazie danych i normalizacji bazy danych prawdopodobnie należy przechowywać informacje dotyczące określonych elementów danego zamówienia jako numerów elementów (#501, #603 itd.). W związku z tym istnieje niejawne połączenie między "przyjazną nazwą" elementu spożywczego w kontrolce ComboBox w formularzu i powiązanym numerem elementu, który znajduje się w zamówieniu. Jest to istota odnośnika tabeli. Aby uzyskać więcej informacji, zobacz How to: Create a Lookup Table with the Windows Forms BindingSource Component (Jak utworzyć tabelę odnośników za pomocą składnika BindingSource formularzy systemu Windows).

Zobacz też