與資料繫結相關的介面
透過 ADO.NET,您可以建立許多不同的資料結構,以符合應用程式的系結需求,以及您正在使用的資料。 您或許會想要建立自有類別以在 Windows Forms 中提供或取用資料。 這些物件可以提供不同程度的功能和複雜度,從基本的資料繫結,到提供設計階段支援、錯誤檢查、變更通知,或甚至對資料本身所做變更的結構化回復支援。
資料繫結介面的取用者
下列各節描述兩組介面物件。 第一個群組所列出的介面會由資料來源作者實作到資料來源上。 這些介面是設計來供資料來源取用者取用,而在大部分情況下,這些取用者就是 Windows Forms 控制項或元件。 第二個群組所列出的介面則是設計來供元件作者使用。 元件作者在建立可支援資料繫結的元件以供 Windows Forms 資料繫結引擎取用時,就會使用這些介面。 您可以在與表單相關聯的類別內實作這些介面,以啟用資料繫結;下列每個案例都會提出一個類別,該類別會實作可與資料互動的介面。 Visual Studio 快速應用程式開發 (RAD) 資料設計體驗工具已利用這項功能。
可供資料來源作者實作的介面
下列介面是設計來供 Windows Forms 控制項取用︰
IList 介面
實作 介面的 IList 類別可以是 Array 、 ArrayList 或 CollectionBase 。 這些是 類型 Object 專案的索引清單。 這些清單必須包含同質型別,因為此索引的第一個項目會決定其型別。 IList 只能在執行時間進行系結。
注意
如果您想要建立商務物件清單以與 Windows Forms 系結,您應該考慮使用 BindingList<T> 。 BindingList<T>是可延伸類別,可實作雙向 Windows Forms 資料系結所需的主要介面。
IBindingList 介面
實作 IBindingList 介面的類別提供更高層級的資料系結功能。 此實作可提供您基本的排序功能和變更通知,讓您在清單項目變更時 (例如,客戶清單的第三個項目變更了 [位址] 欄位) 以及在清單本身變更時 (例如,清單的項目數增加或減少) 使用。 如果您打算讓多個控制項繫結至相同資料,並想要讓其中一個控制項的資料變更傳播到其他繫結控制項,變更通知就很重要。
注意
介面的變更通知是透過 IBindingListSupportsChangeNotification 屬性啟用,當 引發 事件時
true
ListChanged ,表示清單已變更或清單中的專案已變更。參數的 ListChangedEventArgs 屬性會 ListChangedType 描述變更的類型。 因此,每當資料模型更新時,所有相依的檢視 (例如其他繫結至相同資料來源的控制項) 也會隨之更新。 不過,清單中包含的物件在變更時必須通知清單,以便清單可以引發 ListChanged 事件。
注意
BindingList<T>提供 介面的 IBindingList 泛型實作。
-
實作 IBindingListView 介面的類別提供 實作 IBindingList 的所有功能,以及篩選和進階排序功能。 此實作可提供以字串為基礎的篩選功能,以及利用屬性描述元與方向配對來進行的多欄排序功能。
-
實作 介面的 IEditableObject 類別可讓物件控制該物件的變更何時永久。 此實作提供 、 BeginEditEndEdit 和 CancelEdit 方法,可讓您回復對 物件所做的變更。 以下是 、 EndEdit 、 和 CancelEdit 方法運作 BeginEdit 方式的簡短說明,以及它們如何彼此搭配運作,以啟用對資料進行變更的可能復原:
方法 BeginEdit 會發出物件上編輯的開始訊號。 實作這個介面的物件必須在方法呼叫之後 BeginEdit 儲存任何更新,如此一來,如果呼叫 方法,就可以捨棄 CancelEdit 更新。 在資料系結 Windows Forms 中,您可以在單一編輯交易的範圍內多次呼叫 BeginEdit (例如 , BeginEdit 、 BeginEditEndEdit 。 的 IEditableObject 實作應追蹤是否已 BeginEdit 呼叫,並忽略對 BeginEdit 的後續呼叫。 因為這個方法可以多次呼叫,所以後續呼叫它很重要, 這是不具破壞性的;也就是說,後續 BeginEdit 呼叫無法終結已進行的更新,或變更第一次 BeginEdit 呼叫上儲存的資料。
方法 CancelEdit 會捨棄對 物件所做的任何變更。
如需 、 EndEdit 和 方法運作方式 BeginEdit 的詳細資訊,請參閱 將資料儲存回資料庫 CancelEdit 。
控制項會使用此 DataGridView 資料功能的交易式概念。
-
實作 介面的 ICancelAddNew 類別通常會實 IBindingList 作 介面,並可讓您使用 AddNew 方法回復對資料來源所做的新增。 如果您的資料來源實作 IBindingList 介面,您也應該讓它實作 ICancelAddNew 介面。
-
實作 介面的 IDataErrorInfo 類別可讓物件提供自訂錯誤資訊給繫結控制項:
IEnumerable 介面
實作 介面的 IEnumerable 類別通常會由 ASP.NET 取用。 此介面的 Windows Forms 支援只能透過 BindingSource 元件取得。
注意
元件 BindingSource 會將所有 IEnumerable 專案複製到個別清單以供系結之用。
ITypedList 介面
實作 介面的 ITypedList 集合類別可讓您控制向繫結控制項公開的順序和屬性集。
注意
當您實作 GetItemProperties 方法,而且 PropertyDescriptor 陣列不是 Null 時,陣列中的最後一個專案會是描述清單屬性的屬性描述元,該屬性是另一個專案清單。
-
實作 介面的 ICustomTypeDescriptor 類別會提供本身的動態資訊。 這個介面類別似于 ITypedList ,但用於物件而非清單。 這個介面是用來 DataRowView 投影基礎資料列的架構。 的簡單實 ICustomTypeDescriptor 作是由 CustomTypeDescriptor 類別所提供。
注意
若要支援實作 之型 ICustomTypeDescriptor 別的設計階段系結,該型別也必須實 IComponent 作並存在表單上的實例。
IListSource 介面
實作 介面的 IListSource 類別可在非清單物件上啟用以清單為基礎的系結。 的 GetList 方法是 IListSource 用來從不繼承自 IList 的物件傳回可系結清單。 IListSource 由 DataSet 類別使用。
-
實作介面的 IRaiseItemChangedEvents 類別是同時實作 介面的 IBindingList 可系結清單。 此介面可用來指出您的類型是否透過其 RaisesItemChangedEvents 屬性引發 ListChanged 類型的 ItemChanged 事件。
注意
如果您的資料來源提供 屬性來列出先前所述的事件轉換,並且正在與元件互動, BindingSource 您應該實 IRaiseItemChangedEvents 作 。 否則, BindingSource 也會執行 屬性來列出事件轉換,導致效能變慢。
-
實作 介面的 ISupportInitialize 元件會利用批次優化來設定屬性和初始化共同相依屬性。 ISupportInitialize包含兩種方法:
ISupportInitializeNotification 介面
實作 介面的 ISupportInitializeNotification 元件也會實作 ISupportInitialize 介面。 此介面可讓您通知其他 ISupportInitialize 元件初始化已完成。 介面 ISupportInitializeNotification 包含兩個成員:
IsInitialized 傳
boolean
回值,指出元件是否已初始化。Initialized 會在呼叫 時 EndInit 發生。
-
類別若實作此介面,代表其所屬的型別會在其任何屬性值變更時引發事件。 對於會讓控制項的每個屬性有一個變更事件的模式,我們設計了此介面來加以取代。 在 中使用 BindingList<T> 時,商務物件應該實作 介面, INotifyPropertyChanged 而 BindingList'1 會將事件 ListChanged 轉換成 PropertyChanged 類型的 ItemChanged 事件。
注意
若要變更通知發生在系結用戶端與資料來源之間的系結中,系結的資料來源類型應該實 INotifyPropertyChanged 作 介面(慣用),或者您可以為系結類型提供 propertyName
Changed
事件,但您不應該同時執行這兩個動作。
可供元件作者實作的介面
下列介面是設計來供 Windows Forms 資料繫結引擎取用︰
-
類別若實作此介面,就是可支援資料繫結的非控制項元件。 這個類別會透過 DataBindings 這個介面的 和 BindingContext 屬性,傳回元件的資料系結和系結內容。
注意
如果您的元件繼承自 Control ,則不需要實作 IBindableComponent 介面。
-
實作 介面的 ICurrencyManagerProvider 類別是一個元件,提供自己的 CurrencyManager 元件來管理與這個特定元件相關聯的系結。 屬性會提供自訂 CurrencyManager 的 CurrencyManager 存取權。
注意
繼承自 Control 的類別會透過其 BindingContext 屬性自動管理系結,因此您需要實 ICurrencyManagerProvider 作 的情況相當罕見。