資料繫結概觀 (Windows Forms .NET)
在 Windows Forms 中,您不只可以繫結至傳統的資料來源,也能繫結至幾乎任何包含資料的結構。 您可以繫結程序至執行階段計算、從檔案讀取,或衍生自其他控制項之值的值陣列。
此外,您也可以將任何控制項的任何屬性繫結至資料來源。 在傳統資料繫結中,您通常將顯示屬性 — 例如 Text 控制項的 TextBox 屬性 — 繫結到資料來源。 使用 .NET,您也可以選擇透過繫結程序設定其他屬性。 您可以使用繫結來執行下列工作:
設定影像控制項的圖形。
設定一或多個控制項的背景色彩。
設定控制項的大小。
基本上,資料繫結是在表單上自動設定任何控制項的任何執行階段可存取屬性的方法。
與資料繫結相關的介面
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
是可延伸的類別,能夠實作雙向 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 的情況相當罕見。
Windows Form 支援的資料來源
過去,資料繫結一向是在應用程式內使用,以充分運用儲存在資料庫中的資料。 透過 Windows Forms 資料繫結,您可以存取資料庫中的資料以及其他結構中的資料,例如陣列和集合,只要符合特定的最低需求即可。
要繫結到的結構
在 Windows Forms 中,您可以繫結至多種不同的結構,從簡易物件 (簡單繫結) 到複雜的清單,例如 ADO.NET 資料表 (複雜繫結),都含括在內。 對於簡單繫結,Windows Forms 支援繫結至簡易物件的公用屬性。 Windows Forms 清單型繫結通常需要物件支援 IList 介面或 IListSource 介面。 此外,如果您要透過 BindingSource 元件繫結,可以繫結至支援 IEnumerable 介面的物件。
下列清單顯示您在 Windows Forms 中可繫結到的結構。
-
BindingSource 是最常見的 Windows Forms 資料來源,可在資料來源與 Windows Forms 控制項之間執行 Proxy。
BindingSource
的一般使用模式是將您的控制項繫結至BindingSource
,並將BindingSource
繫結至資料來源 (例如,ADO.NET 資料表或商務物件)。BindingSource
提供可啟用及改善資料繫結支援層級的服務。 例如,Windows Forms 清單型控制項 (如 DataGridView 和 ComboBox) 不支援直接繫結至 IEnumerable 資料來源,但您可透過BindingSource
進行繫結,藉以支援此案例。 在此情況下,BindingSource
會將資料來源轉換為 IList。 簡易物件
Windows Forms 支援使用 Binding 類型將控制項屬性的資料繫結至物件執行個體的公用屬性。 在使用 BindingSource 時,Windows Forms 也支援將清單型控制項 (例如 ListControl) 繫結至物件執行個體。
陣列或集合
若要作為資料來源,清單必須實作 IList 介面;其中一個範例是屬於 Array 類別執行個體的陣列。 如需陣列的詳細資訊,請參閱如何:建立物件的陣列 (Visual Basic)。
一般而言,在建立資料繫結的物件清單時,應使用 BindingList<T>。
BindingList
是 IBindingList 介面的泛型版本。IBindingList
介面會藉由新增雙向資料繫結所需的屬性、方法和事件,來擴充 IList 介面。-
Windows Forms 控制項可繫結至僅支援 IEnumerable 介面的資料來源,前提是必須透過 BindingSource 元件進行繫結。
ADO.NET 資料物件
ADO.NET 提供多種可供繫結的資料結構。 各種結構的精細度和複雜性有所不同。
-
DataColumn 是 DataTable 的基本建置組塊,供多個資料行據以組成資料表。 每個
DataColumn
都有 DataType 屬性,以決定資料行所保存的資料種類 (例如,汽車資訊資料表中的汽車製造商)。 您可以將控制項 (例如 TextBox 控制項的 Text 屬性) 簡單繫結至資料表內的資料行。 -
DataTable 是 ADO.NET 中的資料表表示法,包含資料列和資料行。 資料表包含兩個集合:DataColumn,代表指定資料表中的資料行 (最終決定可輸入該資料表中的資料種類),以及 DataRow,代表指定資料表中的資料列。 您可以將控制項複雜繫結至資料表中包含的資訊 (例如,將 DataGridView 控制器繫結至資料表)。 不過,在繫結至
DataTable
時,您是繫結至資料表的預設檢視。 -
DataView 是單一資料表可篩選或排序的自訂檢視。 資料檢視是複雜繫結的控制項所使用的資料「快照集」。 您可以簡單繫結或複雜繫結至資料檢視內的資料,但請注意,您會繫結至資料的固定「圖片」,而不是更新中的全新資料來源。
-
DataSet 是資料庫中所含資料的資料表、關聯性和條件約束的集合。 您可以簡單繫結或複雜繫結至資料集內的資料,但請注意,您會繫結至
DataSet
的預設值 DataViewManager (請參閱下一項要點)。 -
DataViewManager 是整個 DataSet 的自訂檢視,與 DataView 類似,但包含關聯。 透過 DataViewSettings 集合,您可以為
DataViewManager
提供給指定資料表的任何檢視設定預設篩選和排序選項。
-
資料繫結的類型
Windows Forms 可以利用兩種類型的資料繫結:簡單繫結和複雜繫結。 各有不同的優點。
資料繫結的類型 | 描述 |
---|---|
簡單資料繫結 | 控制項繫結至單一資料項目的能力,例如資料集中資料表的資料行值。 簡單資料繫結是一般適用於控制項 (例如 TextBox 控制項或 Label 控制項) 的繫結類型,這些控制項通常只會顯示單一值。 事實上,控制項上的任何屬性都可以繫結至資料庫中的欄位。 Visual Studio 對此功能提供了廣泛的支援。 如需詳細資訊,請參閱巡覽資料和建立簡單繫結控制項 (Windows Forms .NET)。 |
複雜資料繫結 | 控制項繫結至一個以上資料項目的能力,在資料庫中通常會超過一筆記錄。 複雜繫結也稱為清單架構繫結。 支援複雜繫結的控制項範例有 DataGridView、ListBox 和 ComboBox 控制項。 如需複雜資料繫結的範例,請參閱如何:將 Windows Forms ComboBox 或 ListBox 控制項繫結至資料。 |
繫結來源元件
為了簡化資料繫結,Windows Forms 可讓您將資料來源繫結至 BindingSource 元件,然後將控制項繫結至 BindingSource
。 您可以在簡單或複雜繫結案例中使用 BindingSource
。 在任一種情況下,BindingSource
擔任了資料來源與繫結程序控制項之間的媒介,提供變更通知流通管理和其他服務。
使用資料繫結的常見案例
幾乎所有商業應用程式都使用讀取自某種資料來源的資訊,通常是透過資料繫結。 下列清單顯示一些最常見的案例,利用資料繫結作為資料展示和管理的方法。
案例 | 描述 |
---|---|
報表 | 報表會提供有彈性的方式,以在書面文件中顯示和彙總資料。 建立報表,將選取的資料來源內容列印至螢幕或印表機,是一種常見作法。 常見的報表包含清單、發票和摘要。 項目會格式化成清單資料行,且將子項目組織在每個清單項目下,但您應該選擇最適合資料的版面配置。 |
資料輸入 | 若要輸入大量相關資料,或提示使用者輸入資訊,常用的方式是透過資料輸入表單。 使用者可以輸入資訊,或使用文字方塊、選項按鈕、下拉式清單和核取方塊來選取選項。 資訊便會送出並儲存在資料庫中,其結構是根據輸入的資訊。 |
主從式關係 | 主從式應用程式是查看相關資料的一種格式。 具體來說,有兩個具有相連關係的資料表,在一般的商業範例中,指「客戶」資料表和「訂單」資料表,它們之間的關係是連結客戶和其各自的訂單。 如需使用兩個 Windows Forms DataGridView 控制項建立主要/詳細資料應用程式的詳細資訊,請參閱如何:使用兩個 Windows Forms DataGridView 控制項建立主從式表單 |
查閱資料表 | 另一個常見的資料展示/管理案例是資料表查閱。 通常,在較大的資料顯示中,ComboBox 控制項是用來顯示和管理資料。 關鍵在於 ComboBox 控制項中顯示的資料與寫入資料庫的資料不同。 例如,如果您有 ComboBox 控制項,顯示可從雜貨店取得的項目,您可能會想看到產品的名稱 (麵包、牛奶、蛋)。 不過,為了簡化資料庫中的資訊擷取以及資料庫的正規化,您可能會將特定訂單的特定項目資訊儲存為項目編號 (#501、#603 等)。 因此,表單 ComboBox 控制項中雜貨項目的「易記名稱」,與訂單中出現的相關項目編號,兩者之間有隱含的連接。 這是資料表查閱的本質。 如需詳細資訊,請參閱如何:使用 Windows Forms BindingSource 元件建立查閱資料表。 |