與資料繫結相關的介面
透過 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 介面的類別提供更高層級的資料繫結功能。 此實作可提供您基本的排序功能和變更通知,讓您在清單項目變更時 (例如,客戶清單的第三個項目變更了 [位址] 欄位) 以及在清單本身變更時 (例如,清單的項目數增加或減少) 使用。 如果您打算讓多個控制項繫結至相同資料,並想要讓其中一個控制項的資料變更傳播到其他繫結控制項,變更通知就很重要。
注意
IBindingList 介面的變更通知是透過 SupportsChangeNotification 屬性啟用,而當
true
引發 ListChanged 事件時,表示清單已變更或清單中的項目已變更。ListChangedEventArgs 參數的 ListChangedType 屬性會描述變更的類型。 因此,每當資料模型更新時,所有相依的檢視 (例如其他繫結至相同資料來源的控制項) 也會隨之更新。 不過,清單內包含的物件在變更時必須通知清單,以便清單可以引發 ListChanged 事件。
注意
BindingList<T> 提供 IBindingList 介面的泛型實作。
-
實作 IBindingListView 介面的類別提供實作 IBindingList 的所有功能,以及篩選和進階排序功能。 此實作可提供以字串為基礎的篩選功能,以及利用屬性描述元與方向配對來進行的多欄排序功能。
-
實作 IEditableObject 介面的類別可讓物件控制該物件的變更何時成為永久。 此實作提供 BeginEdit、EndEdit 和 CancelEdit 方法,可讓您復原對物件所做的變更。 以下是 BeginEdit、EndEdit 和 CancelEdit 方法運作方式的簡短說明,以及它們如何彼此搭配運作,以啟用對資料進行變更的可能復原:
BeginEdit 方法會發出物件上編輯的開始訊號。 實作這個介面的物件必須在 BeginEdit 方法呼叫之後儲存任何更新,如此一來,如果呼叫 CancelEdit 方法,就可以捨棄該更新。 在資料繫結 Windows Forms 中,您可以在單一編輯交易的範圍內 (例如 BeginEdit、BeginEdit、EndEdit) 多次呼叫 BeginEdit。 IEditableObject 的實作應追蹤是否已呼叫 BeginEdit,並忽略對 BeginEdit 的後續呼叫。 因為這個方法可以多次呼叫,重點在於後續對它的呼叫屬於非破壞性;也就是說,後續 BeginEdit 呼叫無法終結已進行的更新,或變更第一次 BeginEdit 呼叫上儲存的資料。
CancelEdit 方法會捨棄對物件所做的任何變更。
如需 BeginEdit、EndEdit 和 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 介面的類別可在非清單物件上啟用以清單為基礎的繫結。 IListSource 的 GetList 方法是用來從不繼承自 IList 的物件傳回可繫結清單。 IListSource 由 DataSet 類別使用。
-
實作 IRaiseItemChangedEvents 介面的類別是同時實作 IBindingList 介面的可繫結清單。 此介面可用來指出您的類型是否透過其 RaisesItemChangedEvents 屬性引發 ItemChanged 類型的 ListChanged 事件。
注意
如果您的資料來源提供屬性來列出先前所述的事件轉換,且正在與 BindingSource 元件互動,您應該實作 IRaiseItemChangedEvents。 否則,BindingSource 也會執行屬性來列出事件轉換,進而導致效能變慢。
-
元件若實作 ISupportInitialize 介面,就會利用批次最佳化來設定屬性並初始化共同相依的屬性。 ISupportInitialize 包含兩種方法:
ISupportInitializeNotification 介面
實作 ISupportInitializeNotification 介面的元件也會實作 ISupportInitialize 介面。 此介面可讓您通知其他 ISupportInitialize 元件初始化已完成。 ISupportInitializeNotification 介面包含兩個成員:
IsInitialized 傳回
boolean
值,指出元件是否已初始化。Initialized 會在呼叫 EndInit 時發生。
-
類別若實作此介面,代表其所屬的型別會在其任何屬性值變更時引發事件。 對於會讓控制項的每個屬性有一個變更事件的模式,我們設計了此介面來加以取代。 在 BindingList<T> 中使用時,商務物件應該實作 INotifyPropertyChanged 介面,而 BindingList'1 會將 PropertyChanged 事件轉換為類型 ItemChanged 的 ListChanged 事件。
注意
若要讓繫結用戶端與資料來源之間的繫結能夠發生變更通知,您的繫結資料來源型別應該實作 INotifyPropertyChanged 介面 (建議方式),或者您可以提供 propertyName
Changed
事件來作為繫結型別,但這兩種方式只能擇一進行。
可供元件作者實作的介面
下列介面是設計來供 Windows Forms 資料繫結引擎取用︰
-
類別若實作此介面,就是可支援資料繫結的非控制項元件。 這個類別會透過這個介面的 DataBindings 和 BindingContext 屬性,傳回元件的資料繫結和繫結內容。
注意
如果您的元件繼承自 Control,則不需要實作 IBindableComponent 介面。
-
實作 ICurrencyManagerProvider 介面的類別是一個元件,提供其本身的 CurrencyManager 來管理與這個特定元件相關聯的繫結。 CurrencyManager 屬性會提供自訂 CurrencyManager 的存取權。
注意
繼承自 Control 的類別會透過其 BindingContext 屬性自動管理繫結,因此您需要實作 ICurrencyManagerProvider 的情況相當罕見。