Interfejsy dotyczące wiązania danych
Dzięki ADO.NET można utworzyć wiele różnych struktur danych, aby dopasować je 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, do zapewnienia obsługi czasu projektowania, sprawdzania błędów, powiadamiania o zmianie, a nawet obsługi strukturalnych wycofywania zmian wprowadzonych w samych danych.
Użytkownicy interfejsów powiązań danych
W poniższych sekcjach opisano dwie grupy obiektów interfejsu. Pierwsza grupa zawiera listę interfejsów implementowanych w źródłach danych przez autorów źródeł danych. Te interfejsy są przeznaczone do użycia przez użytkowników źródeł danych, które w większości przypadków są kontrolkami lub składnikami windows Forms. Druga grupa zawiera listę interfejsów przeznaczonych do użytku 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 autorów źródeł danych
Następujące interfejsy są przeznaczone do korzystania z kontrolek Windows Forms:
IList Interfejs
Klasa, która implementuje IList interfejs, może być klasy Array, ArrayListlub CollectionBase. Są to indeksowane listy elementów typu Object. Te 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<T> 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, zarówno w przypadku zmiany elementów listy (na przykład trzeci element na liście klientów ma zmianę w polu Adres), jak również wtedy, gdy sama lista ulegnie zmianie (na przykład liczba elementów na liście zwiększa się lub zmniejsza). Powiadomienie o zmianie jest ważne, jeśli planujesz mieć wiele kontrolek powiązanych z tymi samymi danymi, a zmiany danych wprowadzone w jednej z kontrolek mają być propagowane 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 IBindingList, a także filtrowanie i zaawansowane funkcje sortowania. Ta implementacja oferuje filtrowanie oparte na ciągach i sortowanie wielokolumnowe z parami kierunkowymi deskryptora 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 BeginEditzapewnia 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 działania w połączeniu 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 tej metody nie są destruktywne; oznacza to, że 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:
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, zapewnia możliwość 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:
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:
IsInitialized Zwraca wartość wskazującą
boolean
, czy składnik jest inicjowany.Initialized występuje, gdy EndInit jest wywoływany.
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, typ powiązanego źródła danych powinien implementować INotifyPropertyChanged interfejs (preferowany) lub można podać zdarzenia propertyName
Changed
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 trzeba 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.
Zobacz też
.NET Desktop feedback