Udostępnij za pośrednictwem


Interfejsy związane z powiązaniem 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 Data-Binding

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 programu Visual Studio do projektowania danych w ramach szybkiego tworzenia aplikacji (RAD) już korzystają z tej funkcji.

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

Następujące interfejsy są przeznaczone dla kontrolek Windows Forms:

  • interfejs IList

    Klasa, która implementuje interfejs IList, może być 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 byłby dostępny do powiązania tylko w czasie wykonywania.

    Notatka

    Jeśli chcesz utworzyć listę obiektów biznesowych na potrzeby powiązania z formularzami systemu Windows, rozważ użycie BindingList<T>. BindingList<T> to 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, 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.

    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.

    Notatka

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

  • Interfejs IBindingListView

    Klasa, która implementuje interfejs IBindingListView 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.

  • interfejs IEditableObject

    Klasa, która implementuje interfejs IEditableObject, umożliwia obiektowi kontrolowanie, kiedy zmiany w tym obiekcie są trwałe. Ta implementacja zapewnia metody BeginEdit, EndEditi CancelEdit, które umożliwiają wycofywanie zmian wprowadzonych w obiekcie. Poniżej przedstawiono krótkie wyjaśnienie funkcjonowania BeginEdit, EndEditi CancelEdit metod 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 wywołaniu metody BeginEdit w 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ć BeginEdit wiele razy w zakresie jednej transakcji edycji (na przykład BeginEdit, BeginEdit, EndEdit). Implementacje IEditableObject powinny sprawdzać, czy BeginEdit już została wywołana, i ignorować kolejne wywołania 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 wywołania BeginEdit nie mogą zniszczyć aktualizacji, które zostały wprowadzone lub zmienić dane zapisane w pierwszym wywołaniu BeginEdit.

    • 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ć interfejs ICancelAddNew.

  • Interfejs IDataErrorInfo

    Klasa implementująca interfejs IDataErrorInfo umożliwia obiektom oferowanie niestandardowych informacji o błędach powiązanych kontrolek.

    • 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 kolumnie State jest nieprawidłowa").

  • 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.

    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 uwidocznionych dla powiązanej kontrolki.

    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.

  • ICustomTypeDescriptor interfejs

    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 ICustomTypeDescriptor jest dostarczana przez klasę CustomTypeDescriptor.

    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 GetListIListSource służy do zwracania wiążącej listy z obiektu, który nie dziedziczy z IList. IListSource jest 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.

    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 BindingSource bę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. ISupportInitialize zawiera dwie metody:

    • BeginInit sygnalizuje, że inicjowanie obiektu się rozpoczyna.

    • EndInit sygnalizuje zakończenie inicjowania obiektu.

  • interfejs ISupportInitializeNotification

    Składnik implementujący interfejs ISupportInitializeNotification implementuje również interfejs ISupportInitialize. Ten interfejs umożliwia powiadamianie innych ISupportInitialize składników, że inicjowanie zostało ukończone. Interfejs ISupportInitializeNotification zawiera dwóch członków.

  • 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.

    Notatka

    Aby powiadomienie o zmianie mogło być realizowane w powiązaniu między klientem powiązanym a przypisanym źródłem danych, typ przypisanego źródła danych powinien zaimplementować interfejs INotifyPropertyChanged (preferowany) lub zapewnić zdarzenia propertyNameChanged dla typu przypisanego, ale nie należy stosować obu metod jednocześnie.

Interfejsy do implementacji przez autorów komponentów

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

Zobacz też