資料系結概觀 (Windows Forms .NET)

在 Windows Forms 中,您不只可以繫結至傳統的資料來源,也能繫結至幾乎任何包含資料的結構。 您可以繫結程序至執行階段計算、從檔案讀取,或衍生自其他控制項之值的值陣列。

此外,您也可以將任何控制項的任何屬性繫結至資料來源。 在傳統資料繫結中,您通常將顯示屬性 — 例如 Text 控制項的 TextBox 屬性 — 繫結到資料來源。 使用 .NET 時,您也可以選擇透過系結設定其他屬性。 您可以使用繫結來執行下列工作:

  • 設定影像控制項的圖形。

  • 設定一或多個控制項的背景色彩。

  • 設定控制項的大小。

基本上,資料繫結是在表單上自動設定任何控制項的任何執行階段可存取屬性的方法。

ADO.NET 可讓您建立許多不同的資料結構,以符合應用程式的系結需求,以及您正在使用的資料。 您可能想要建立自己的類別,以在 Windows Forms 中提供或取用資料。 這些物件可以提供不同層級的功能和複雜性。 從基本資料系結到提供設計階段支援、錯誤檢查、變更通知,或甚至支援對資料本身所做的變更進行結構化復原。

資料系結介面的取用者

下列各節描述兩組介面物件。 第一組介面是由資料來源作者在資料來源上實作。 資料來源取用者,例如 Windows Forms 控制項或元件會實作這些介面。 第二組介面的設計目的是要由元件作者使用。 元件作者在建立支援 Windows Forms 資料系結引擎所取用之資料系結的元件時,會使用這些介面。 您可以在與表單相關聯的類別內實作這些介面,以啟用資料系結。 每個案例都會呈現一個類別,該類別會實作可與資料互動的介面。 Visual Studio 快速應用程式開發 (RAD) 資料設計體驗工具已利用這項功能。

資料來源作者實作的介面

Windows Forms 控制項會實作下列介面:

  • IList 介面

    實作 介面的 IList 類別可以是 ArrayArrayListCollectionBase 。 這些是型 Object 別專案的索引清單,而且清單必須包含同質型別,因為索引的第一個專案會決定類型。 IList 只能在執行時間進行系結。

    注意

    如果您想要建立商務物件清單以與 Windows Forms 系結,您應該考慮使用 BindingList<T>BindingList是可延伸類別,可實作雙向 Windows Forms 資料系結所需的主要介面。

  • IBindingList 介面

    實作 IBindingList 介面的類別提供更高層級的資料系結功能。 此實作提供基本排序功能和變更通知。 當清單專案變更,以及清單本身變更時,這兩者都很有用。 如果您打算將多個控制項系結至相同的資料,變更通知很重要。 它可協助您在其中一個控制項中進行資料變更,以傳播至其他繫結控制項。

    注意

    介面的變更通知是透過 IBindingListSupportsChangeNotification 屬性啟用,當 引發 事件時 trueListChanged ,表示清單已變更或清單中的專案已變更。

    參數的 ListChangedEventArgs 屬性會 ListChangedType 描述變更的類型。 因此,每當資料模型更新時,所有相依的檢視 (例如其他繫結至相同資料來源的控制項) 也會隨之更新。 不過,清單中包含的物件在變更時必須通知清單,以便清單可以引發 ListChanged 事件。

    注意

    BindingList<T>提供 介面的 IBindingList 泛型實作。

  • IBindingListView 介面

    實作 IBindingListView 介面的類別提供 實作 IBindingList 的所有功能,以及篩選和進階排序功能。 此實作提供以字串為基礎的篩選,以及使用屬性描述元方向配對的多資料行排序。

  • IEditableObject 介面

    實作 介面的 IEditableObject 類別可讓物件控制該物件的變更何時永久。 此實作支援 BeginEditEndEditCancelEdit 方法,可讓您回復對 物件所做的變更。 以下是 、 EndEditCancelEdit 方法運作 BeginEdit 的簡短說明,以及它們如何彼此搭配運作,以啟用對資料進行變更的可能復原:

    • 方法 BeginEdit 會發出物件上編輯的開始訊號。 實作這個介面的物件必須在方法呼叫之後 BeginEdit 儲存任何更新,如此一來,如果呼叫 方法,就可以捨棄 CancelEdit 更新。 在資料系結 Windows Forms 中,您可以在單一編輯交易的範圍內多次呼叫 BeginEdit (例如 , BeginEditBeginEditEndEdit 。 的 IEditableObject 實作應追蹤是否已 BeginEdit 呼叫,並忽略對 BeginEdit 的後續呼叫。 因為這個方法可以多次呼叫,所以後續呼叫它非常重要。 後續 BeginEdit 呼叫無法終結已進行的更新,或變更第一次 BeginEdit 呼叫上儲存的資料。

    • 如果物件目前處於編輯模式,方法 EndEdit 會推送自 呼叫至基礎物件之後 BeginEdit 的任何變更。

    • 方法 CancelEdit 會捨棄對 物件所做的任何變更。

    如需 、 EndEdit 和 方法運作方式 BeginEdit 的詳細資訊,請參閱 將資料儲存回資料庫 CancelEdit

    控制項會使用此 DataGridView 資料功能的交易式概念。

  • ICancelAddNew 介面

    實作 介面的 ICancelAddNew 類別通常會實 IBindingList 作 介面,並可讓您使用 AddNew 方法回復對資料來源所做的新增。 如果您的資料來源實作 IBindingList 介面,您也應該讓它實作 ICancelAddNew 介面。

  • IDataErrorInfo 介面

    實作 介面的 IDataErrorInfo 類別可讓物件提供自訂錯誤資訊給繫結控制項:

    • 屬性 Error 會傳回一般錯誤訊息文字(例如「發生錯誤」)。

    • 屬性 Item[] 會從資料行傳回具有特定錯誤訊息的字串(例如,「資料行中的 State 值無效」)。

  • IEnumerable 介面

    實作 介面的 IEnumerable 類別通常會由 ASP.NET 取用。 此介面的 Windows Forms 支援只能透過 BindingSource 元件取得。

    注意

    元件 BindingSource 會將所有 IEnumerable 專案複製到個別清單以供系結之用。

  • ITypedList 介面

    實作 介面的 ITypedList 集合類別提供功能來控制對繫結控制項公開的順序和屬性集。

    注意

    當您實作 GetItemProperties 方法,而且 PropertyDescriptor 陣列不是 Null 時,陣列中的最後一個專案會是描述清單屬性的屬性描述元,該屬性是另一個專案清單。

  • ICustomTypeDescriptor 介面

    實作 介面的 ICustomTypeDescriptor 類別會提供本身的動態資訊。 這個介面類別似于 ITypedList ,但用於物件而非清單。 這個介面是用來 DataRowView 投影基礎資料列的架構。 的簡單實 ICustomTypeDescriptor 作是由 CustomTypeDescriptor 類別所提供。

    注意

    若要支援實作 之型 ICustomTypeDescriptor 別的設計階段系結,該型別也必須實 IComponent 作並存在表單上的實例。

  • IListSource 介面

    實作 介面的 IListSource 類別可在非清單物件上啟用以清單為基礎的系結。 的 GetList 方法 IListSource 可用來從不繼承自 IList 的物件傳回可系結清單。IListSourceDataSet 類別使用。

  • IRaiseItemChangedEvents 介面

    實作介面的 IRaiseItemChangedEvents 類別是同時實作 介面的 IBindingList 可系結清單。 此介面可用來指出您的類型是否透過其 RaisesItemChangedEvents 屬性引發 ListChanged 類型的 ItemChanged 事件。

    注意

    如果您的資料來源提供 屬性來列出先前所述的事件轉換,並且正在與元件互動, BindingSource 您應該實 IRaiseItemChangedEvents 作 。 否則, BindingSource 也會執行 屬性來列出事件轉換,導致效能變慢。

  • ISupportInitialize 介面

    實作 介面的 ISupportInitialize 元件會利用批次優化來設定屬性和初始化共同相依屬性。 ISupportInitialize包含兩種方法:

    • BeginInit 表示物件初始化正在啟動。

    • EndInit 表示物件初始化正在完成。

  • ISupportInitializeNotification 介面

    實作 介面的 ISupportInitializeNotification 元件也會實作 ISupportInitialize 介面。 此介面可讓您通知其他 ISupportInitialize 元件初始化已完成。 介面 ISupportInitializeNotification 包含兩個成員:

  • INotifyPropertyChanged 介面

    類別若實作此介面,代表其所屬的型別會在其任何屬性值變更時引發事件。 對於會讓控制項的每個屬性有一個變更事件的模式,我們設計了此介面來加以取代。 在 中使用 BindingList<T> 時,商務物件應該實作 介面, INotifyPropertyChanged 而 BindingList'1 會將事件 ListChanged 轉換成 PropertyChanged 類型的 ItemChanged 事件。

    注意

    若要在系結用戶端與資料來源之間的系結中發生變更通知,系結的資料來源類型應該實 INotifyPropertyChanged 作 介面(慣用),或者您可以為系結類型提供 propertyName Changed 事件,但您不應該同時執行這兩個動作。

元件作者實作的介面

下列介面是設計來供 Windows Forms 資料繫結引擎取用︰

Windows Forms 支援的資料來源

傳統上,資料系結已在應用程式內使用,以利用儲存在資料庫中的資料。 使用 Windows Forms 資料系結,只要符合特定最低需求,您就可以從資料庫和資料存取其他結構中的資料,例如陣列和集合。

要系結至的結構

在 Windows Forms 中,您可以系結至各種不同的結構,從簡單物件(簡單系結)到複雜的清單,例如 ADO.NET 資料表(複雜系結)。 針對簡單系結,Windows Forms 支援將系結至簡單物件上的公用屬性。 Windows Forms 清單型系結通常需要物件支援 IList 介面或 IListSource 介面。 此外,如果您要透過 BindingSource 元件系結,則可以系結至支援 IEnumerable 介面的物件。

下列清單顯示您可以在 Windows Forms 中系結至的結構。

  • BindingSource

    BindingSource是最常見的 Windows Forms 資料來源,並在資料來源與 Windows Forms 控制項之間執行 Proxy。 一般 BindingSource 使用模式是將控制項系結至 , BindingSource 並將 系結 BindingSource 至資料來源(例如,ADO.NET 資料表或商務物件)。 提供 BindingSource 可啟用和改善資料系結支援層級的服務。 例如,Windows Forms 清單型控制項,例如 DataGridViewComboBox 不支援直接系結至資料來源,不過,您可以透過 系結來 IEnumerableBindingSource 啟用此案例。 在此情況下,會將 BindingSource 資料來源 IList 轉換成 。

  • 簡單物件

    Windows Forms 支援使用 Binding 型別之物件實例上的公用屬性資料系結控制項屬性。 Windows Forms 也支援以系結清單為基礎的控制項,例如 ListControl 使用 物件實例時的 BindingSource

  • 陣列或集合

    若要做為資料來源,清單必須實 IList 作 介面;其中一個範例是類別實例的 Array 陣列。 如需陣列的詳細資訊,請參閱 How to: Create an Array of Objects (Visual Basic)

    一般而言,當您建立資料系結的物件清單時,應該使用 BindingList<T>BindingList 是介面的 IBindingList 泛型版本。 介面 IBindingListIList 藉由新增雙向資料系結所需的屬性、方法和事件,來擴充 介面。

  • IEnumerable

    Windows Forms 控制項可以系結至資料來源,這些資料來源只支援透過 BindingSource 元件系結時才支援 IEnumerable 介面。

  • ADO.NET 資料物件

    ADO.NET 提供許多適合系結至的資料結構。 每個都因複雜度和複雜度而異。

    • DataColumn

      DataColumn 的基本建置組塊 DataTable ,在該資料行中,多個資料行組成資料表。 每個 DataColumn 屬性都會 DataType 決定資料行所保存的資料種類(例如,描述汽車的資料表中的汽車製造)。 您可以簡單地將控制項(例如 TextBox 控制項的 Text 屬性)系結至資料表內的資料行。

    • DataTable

      DataTable是資料表的標記法,其中具有資料列和資料行,ADO.NET。 資料表包含兩個集合: DataColumn ,代表指定資料表中的資料行(最終決定可輸入該資料表的資料種類),以及 DataRow ,代表指定資料表中的資料列。 您可以將控制項複雜地系結至資料表中包含的資訊(例如將 DataGridView 控制項系結至資料表)。 不過,當您系結至 DataTable 時,您會系結至資料表的預設檢視。

    • DataView

      DataView是可篩選或排序之單一資料表的自訂檢視。 資料檢視是複雜繫結控制項所使用的資料「快照集」。 您可以簡單系結或複雜系結至資料檢視中的資料,但請注意,您要系結至資料的固定「圖片」,而不是更新資料來源。

    • DataSet

      DataSet是資料庫中資料的資料表、關聯性和條件約束集合。 您可以簡單系結或複雜系結至資料集內的資料,但請注意,您要系結至 的預設值 DataViewManagerDataSet (請參閱下一個專案符號點)。

    • DataViewManager

      DataViewManager是整個 DataSet 的自訂檢視,類似于 DataView ,但包含關聯性。 DataViewSettings透過集合,您可以為指定資料表的任何檢視 DataViewManager 設定預設篩選和排序選項。

資料系結的類型

Windows Forms 可以利用兩種類型的資料繫結:簡單繫結和複雜繫結。 各有不同的優點。

資料繫結的類型 描述
簡單資料繫結 控制項繫結至單一資料項目的能力,例如資料集中資料表的資料行值。 簡單資料系結是控制項的一般系結類型,例如 TextBox 控制項或 Label 控制項,這些控制項通常只會顯示單一值。 事實上,控制項上的任何屬性都可以繫結至資料庫中的欄位。 Visual Studio 中對這項功能有廣泛的支援。

如需詳細資訊,請參閱 巡覽資料 建立簡單繫結控制項 (Windows Forms .NET)
複雜資料繫結 控制項繫結至一個以上資料項目的能力,在資料庫中通常會超過一筆記錄。 複雜繫結也稱為清單架構繫結。 支援複雜繫結的控制項範例有 DataGridViewListBoxComboBox 控制項。 如需複雜資料系結的範例,請參閱 如何:將 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 元件 建立查閱表格。

另請參閱