Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W formularzach Windows Forms można nie tylko powiązać z tradycyjnymi źródłami danych, ale także z niemal każdą strukturą zawierającą dane. Można powiązać się z tablicą wartości, które są obliczane w czasie wykonywania, odczytywane z pliku, lub które pochodzą 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. Możesz użyć powiązania danych, aby wykonać następujące zadania:
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.
Interfejsy związane z powiązaniem danych
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 wiązania danych, po zapewnienie obsługi w czasie projektowania, sprawdzania błędów, powiadamiania o zmianach, a nawet obsługę strukturalnego 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, który obsługuje powiązanie danych, mającego być wykorzystywany przez aparat powiązania danych Windows Forms. 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 programu Visual Studio do projektowania danych w ramach szybkiego tworzenia aplikacji (RAD) już korzystają z tej funkcji.
Interfejsy implementacji przez autorów źródeł danych
Kontrolki Windows Forms implementują następujące interfejsy:
interfejs IList
Klasa, która implementuje interfejs IList, może być Array, ArrayListlub CollectionBase. Są to indeksowane listy elementów typu Object , a listy muszą zawierać homogeniczne typy, ponieważ pierwszy element indeksu określa typ.
IListbyłby dostępny do powiązania tylko w czasie wykonywania.Uwaga / Notatka
Jeśli chcesz utworzyć listę obiektów biznesowych na potrzeby powiązania z formularzami systemu Windows, rozważ użycie BindingList<T>.
BindingListto rozszerzalna klasa, która implementuje podstawowe interfejsy wymagane do dwukierunkowego powiązania danych formularzy systemu Windows.interfejs IBindingList
Klasa, która implementuje interfejs IBindingList, 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 / Notatka
Powiadomienie o zmianie jest włączone dla interfejsu IBindingList za pośrednictwem właściwości SupportsChangeNotification, która po
truezgłasza zdarzenie ListChanged wskazujące zmianę listy lub zmieniony element na liście.Typ zmiany jest opisany przez właściwość ListChangedType 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 zawarte na liście będą musiały powiadomić listę po zmianie, aby lista mogła zgłosić zdarzenie ListChanged.
Uwaga / Notatka
BindingList<T> zapewnia ogólną implementację interfejsu IBindingList.
interfejs IBindingListView
Klasa, która implementuje IBindingListView interfejs, zapewnia wszystkie funkcje implementacji IBindingListprogramu , wraz z filtrowaniem i zaawansowanymi funkcjami sortowania. Ta implementacja zapewnia filtrowanie na podstawie ciągów tekstowych oraz sortowanie według wielu kolumn z użyciem par właściwość-kierunek.
interfejs IEditableObject
Klasa, która implementuje interfejs IEditableObject, umożliwia obiektowi kontrolowanie, kiedy zmiany w tym obiekcie są trwałe. Ta implementacja obsługuje metody BeginEdit, EndEdit oraz CancelEdit, które umożliwiają wycofanie zmian dokonanych w obiekcie. Poniżej przedstawiono krótkie wyjaśnienie funkcjonowania
BeginEditmetod ,EndEditiCancelEditoraz 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 wywołaniu metody
BeginEditw taki sposób, że aktualizacje mogą zostać odrzucone, jeśli zostanie wywołana metoda CancelEdit. W powiązaniu danych formularzy systemu Windows można wywołaćBeginEditwiele razy w zakresie jednej transakcji edycji (na przykładBeginEdit,BeginEdit, EndEdit). Implementacje IEditableObject powinny sprawdzać, czyBeginEditjuż została wywołana, i ignorować kolejne wywołaniaBeginEdit. Ponieważ ta metoda może być wywoływana wiele razy, ważne jest, aby kolejne wywołania do niej nie są destruktywne. KolejneBeginEditwywołania nie mogą zniszczyć aktualizacji, które zostały wprowadzone lub zmienić dane zapisane podczas pierwszegoBeginEditwywołania.Metoda EndEdit przesuwa wszystkie zmiany od czasu wywołania BeginEdit 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 działania metod BeginEdit, EndEditi CancelEdit, zobacz Zapisywanie danych z powrotem do bazy danych.
To transakcyjne pojęcie funkcjonalności danych jest używane przez kontrolę DataGridView.
interfejs ICancelAddNew
Klasa, która implementuje interfejs ICancelAddNew, zwykle implementuje interfejs IBindingList i umożliwia wycofanie dodatku wprowadzonego do źródła danych za pomocą metody AddNew. Jeśli źródło danych implementuje interfejs
IBindingList, należy również zaimplementować interfejsICancelAddNew.interfejs IDataErrorInfo
Klasa implementująca interfejs IDataErrorInfo umożliwia obiektom oferowanie niestandardowych informacji o błędach powiązanych kontrolek.
interfejs IEnumerable
Klasa, która implementuje interfejs IEnumerable, jest zwykle zużywana przez ASP.NET. Obsługa formularzy systemu Windows dla tego interfejsu jest dostępna tylko za pośrednictwem składnika BindingSource.
Uwaga / Notatka
Składnik BindingSource kopiuje wszystkie elementy IEnumerable do oddzielnej listy na potrzeby powiązania.
interfejs ITypedList
Klasa kolekcji, która implementuje interfejs ITypedList, zapewnia możliwość kontrolowania kolejności i zestawu właściwości dostępnych dla kontrolki powiązanej.
Uwaga / Notatka
Podczas implementowania metody GetItemProperties, 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.
interfejs ICustomTypeDescriptor
Klasa, która implementuje interfejs ICustomTypeDescriptor, udostępnia dynamiczne informacje o sobie. Ten interfejs jest podobny do ITypedList, ale jest używany dla obiektów, a nie list. Ten interfejs jest używany przez DataRowView do projekcji schematu wierszy bazowych. Prosta implementacja
ICustomTypeDescriptorjest dostarczana przez klasę CustomTypeDescriptor.Uwaga / Notatka
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.
interfejs IListSource
Klasa, która implementuje interfejs IListSource umożliwia powiązanie oparte na liście na obiektach innych niż listy. Metoda GetList
IListSourcesłuży do zwracania wiążącej się listy z obiektu, który nie dziedziczy z klasy IList.IListSourcejest używana przez klasę DataSet.interfejs IRaiseItemChangedEvents
Klasa, która implementuje interfejs IRaiseItemChangedEvents, jest wiązalną listą, która implementuje również interfejs IBindingList. Interfejs służy do określania, czy twój typ zgłasza zdarzenia ListChanged typu ItemChanged za pomocą swojej właściwości RaisesItemChangedEvents.
Uwaga / Notatka
Należy zaimplementować IRaiseItemChangedEvents, jeśli źródło danych udostępnia właściwość do wyświetlania listy konwersji zdarzeń opisanych wcześniej i wchodzi w interakcję ze składnikiem BindingSource. W przeciwnym razie
BindingSourcebędzie również wykonywać właściwości w celu wyświetlenia listy konwersji zdarzeń, co spowoduje obniżenie wydajności.interfejs ISupportInitialize
Składnik, który implementuje interfejs ISupportInitialize, wykorzystuje optymalizacje wsadowe do ustawiania właściwości i inicjalizacji współzależnych właściwości.
ISupportInitializezawiera dwie metody:interfejs ISupportInitializeNotification
Składnik implementujący interfejs ISupportInitializeNotification implementuje również interfejs ISupportInitialize. Ten interfejs umożliwia powiadamianie innych
ISupportInitializeskładników, że inicjowanie zostało ukończone. InterfejsISupportInitializeNotificationzawiera dwóch członków.IsInitialized zwraca wartość
booleanwskazującą, czy składnik jest zainicjalizowany.Initialized występuje po wywołaniu EndInit.
interfejs INotifyPropertyChanged
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 BindingList<T>obiekt biznesowy powinien implementować interfejs INotifyPropertyChanged, a klasa BindingList'1 konwertuje zdarzenia PropertyChanged na zdarzenia typu ListChanged typu ItemChanged.
Uwaga / Notatka
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 propertyName
Changeddla 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 silnik powiązania danych Windows Forms:
interfejs IBindableComponent
Klasa, która implementuje ten interfejs, jest składnikiem, który nie jest kontrolką i obsługuje powiązanie danych. Ta klasa zwraca powiązania danych i kontekst powiązania składnika za pomocą DataBindings i BindingContext właściwości tego interfejsu.
Uwaga / Notatka
Jeśli składnik dziedziczy z klasy Control, nie musisz implementować interfejsu IBindableComponent.
interfejs ICurrencyManagerProvider
Klasa, która implementuje interfejs ICurrencyManagerProvider, jest składnikiem, który udostępnia własne CurrencyManager do zarządzania powiązaniami skojarzonymi z tym konkretnym składnikiem. Dostęp do niestandardowej
CurrencyManagerjest udostępniany poprzez właściwość CurrencyManager.Uwaga / Notatka
Klasa dziedziczona po Control automatycznie zarządza powiązaniami za pośrednictwem jej właściwości BindingContext, więc przypadki, w których należy zaimplementować 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ą składnika BindingSource, można powiązać z obsługującym go obiektem interfejsem IEnumerable.
Na poniższej liście przedstawiono struktury, do których można powiązać w Windows Forms.
-
BindingSource jest najczęściej używanym źródłem danych windows Forms i pełni rolę serwera proxy między źródłem danych a kontrolkami windows Forms. Ogólny wzorzec użycia
BindingSourcepolega na powiązaniu kontrolek zBindingSourcei powiązaniuBindingSourceze źródłem danych (na przykład tabeli danych ADO.NET lub obiektu biznesowego).BindingSourcezapewnia 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ą elementuBindingSource. W takim przypadkuBindingSourceprzekonwertuje źródło danych na IList. Proste obiekty
Formularze systemu Windows obsługują powiązanie właściwości kontrolek z publicznymi właściwościami w wystąpieniu obiektu za pomocą typu Binding. Formularze systemu Windows obsługują również kontrolki oparte na listach powiązanych, takie jak ListControl, które można powiązać z wystąpieniem obiektu, gdy używany jest BindingSource.
Tablica lub kolekcja
Aby działać jako źródło danych, lista musi zaimplementować interfejs IList; przykładem może być tablica, która jest wystąpieniem klasy Array. Aby uzyskać więcej informacji na temat tablic, zobacz 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.
BindingListjest ogólną wersją interfejsu IBindingList. InterfejsIBindingListrozszerza interfejs IList przez dodanie właściwości, metod i zdarzeń niezbędnych do powiązania danych dwukierunkowych.-
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 obiekty 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.
-
Element to DataColumn podstawowy blok konstrukcyjny obiektu DataTable, w ramach którego wiele kolumn składa się z tabeli. Każda
DataColumnma właściwość DataType, która określa rodzaj danych przechowywanych w kolumnie (na przykład marka samochodu w tabeli opisującej samochody). Możesz prosto powiązać kontrolkę (np. właściwość TextBox kontrolki Text) z kolumną w tabeli danych. -
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. Możesz złożenie powiązać kontrolkę z informacjami zawartymi w tabeli danych (na przykład powiązując kontrolkę DataGridView z tabelą danych). Jednak po powiązaniu z elementem
DataTable, wiążesz się z domyślnym widokiem tabeli. -
DataView to dostosowany widok pojedynczej tabeli danych, która może być filtrowana lub sortowana. Widok danych to "migawka" danych używana przez kontrolki powiązane złożonymi zależnościami. Możesz użyć prostego lub złożonego powiązania, aby powiązać dane w widoku danych, ale pamiętaj, że wiążesz się ze stałym "obrazem" danych, a nie z przejrzystym, aktualizującym źródłem danych.
-
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 jest dostosowanym widokiem całego DataSet, analogicznym do DataView, ale z uwzględnieniem relacji. W przypadku kolekcji DataViewSettings można ustawić domyślne filtry i opcje sortowania dla wszystkich widoków, które
DataViewManagerma 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 komponentu ź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 a powiązanymi kontrolkami, zapewniając powiadomienia o zmianach, zarządzanie walutą oraz inne usługi.
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 jako kolumny list z podpunktami zorganizowanymi pod każdym elementem listy, jednak należy wybrać układ, który najlepiej pasuje do danych. |
| 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 główna/szczegółowa to jeden format do przeglądania powiązanych danych. W szczególności istnieją dwie tabele danych powiązane w klasycznym przykładzie biznesowym: tabela "Klienci" i tabela "Zamówienia" z relacją między nimi, która łączy klientów i ich odpowiednie zamówienia. Aby uzyskać więcej informacji na temat tworzenia aplikacji typu master/detail z dwoma kontrolkami Windows Forms, zobacz DataGridView. |
| Tabela wyszukiwania | Innym typowym scenariuszem prezentacji/manipulowania danymi jest wyszukiwanie w 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 wyszukiwania w 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 także
.NET Desktop feedback