BindingSource 元件架構

透過 BindingSource 元件,您可以將全部 Windows Forms 控制項通用繫結至資料來源。

BindingSource 元件可簡化將控制項繫結至資料來源的程式,並提供下列優於傳統資料繫結的優點:

  • 啟用對商業物件的設計時間繫結。

  • 封裝 CurrencyManager 功能,並在設計時間公開 CurrencyManager 事件。

  • 為原本不支援清單變更通知的資料來源提供清單變更通知,以簡化建立支援 IBindingList 介面的清單。

  • 提供 IBindingList.AddNew 方法的擴充點。

  • 提供資料來源與控制項之間的間接存取層級。 當資料來源在執行階段可能變更時,此間接取值很重要。

  • 與其他資料相關的 Windows Forms 控制項互操作,特別是 BindingNavigatorDataGridView 控制項。

基於這些原因,BindingSource 元件是將 Windows Forms 控制項繫結至資料來源的慣用方式。

BindingSource 功能

BindingSource 元件提供數個功能來將資料繫結控制項。 透過這些功能,您可以實作大部分的資料繫結案例,幾乎不需要撰寫程式碼。

BindingSource 元件藉由提供一致的介面來存取許多不同類型的資料來源來完成這項作業。 這表示您使用相同的程序繫結至任何類型。 例如,您可以將 DataSource 屬性附加至 DataSet 或商務物件,而且在這兩種情況下,您都使用相同的屬性、方法和事件集來操作資料來源。

BindingSource 元件所提供的一致介面可大幅簡化將資料繫結至控制項的程式。 對於提供變更通知的資料來源類型,BindingSource 元件會自動在控制項與資料來源之間通訊變更。 對於未提供變更通知的資料來源類型,會提供可讓您引發變更通知的事件。 下列清單顯示 BindingSource 元件支援的功能:

間接

BindingSource 元件提供控制項與資料來源之間的間接存取層級。 您不會將控制項直接繫結至資料來源,而是將控制項繫結至 BindingSource,並將資料來源附加至 BindingSource 元件的 DataSource 屬性。

透過此間接取值層級,您可以變更資料來源,而不需要重設控制項繫結。 這可提供下列功能:

貨幣管理

BindingSource 元件會實作 ICurrencyManagerProvider 介面,為您處理貨幣管理。 使用 ICurrencyManagerProvider 介面,除了繫結至相同 DataMember 的另一個 BindingSource 貨幣管理員之外,您也可以存取 BindingSource 的貨幣管理員。

BindingSource 元件會封裝 CurrencyManager 功能,並公開最常見的 CurrencyManager 屬性和事件。 下表描述與貨幣管理相關的一些成員。

CurrencyManager 屬性
與這個 BindingSource 關聯的 Currency 管理員。

GetRelatedCurrencyManager 方法
如果有另一個 BindingSource 繫結至指定的資料成員,請取得其貨幣管理員。

Current 屬性
取得資料來源的目前項目。

Position 屬性
取得或設定基礎清單中的目前位置。

EndEdit 方法
將暫止的變更套用至基礎資料來源。

CancelEdit 方法
取消目前的編輯作業。

資料來源作為清單

BindingSource 元件實作 IBindingListViewITypedList 介面。 透過此實作,您可以使用 BindingSource 元件本身作為資料來源,而不需要任何外部儲存體。

BindingSource 元件附加至資料來源時,它會將資料來源公開為清單。

DataSource 屬性可以設定為數個資料來源。 這些包括類型、物件和型別清單。 產生的資料來源將會公開為清單。 下表顯示一些常見的資料來源和結果清單評估。

DataSource 屬性 清單結果
null 參考 (在 Visual Basic 中為 Nothing) 物件的空白 IBindingList。 新增項目會將清單設定為已新增項目的類型。
null 參考 (在 Visual Basic 中為 Nothing),其中 DataMember 設定 不支援;引發 ArgumentException
類型為「T」的非清單類型或物件 類型「T」的空白 IBindingList
陣列執行個體 包含陣列元素的 IBindingList
IEnumerable 執行個體 包含 IEnumerable 個項目的 IBindingList
包含類型「T」的清單執行個體 包含類型「T」的 IBindingList 執行個體。

此外,DataSource 可以設定為其他清單類型,例如 IListSourceITypedList,而 BindingSource 會妥善處理它們。 在此情況下,清單中所包含的類型應該具有無參數建構函式。

BindingSource 作為 IBindingList

BindingSource 元件提供用於存取和操作基本資料的成員作為 IBindingList。 下表會介紹其中一些成員。

member 描述
List 屬性 取得評估 DataSourceDataMember 屬性所產生的清單。
AddNew 方法 將新的項目加入基礎清單中。 適用於實作 IBindingList 介面並允許新增項目的資料來源 (也就是,AllowNew 屬性設定為 true)。

自訂項目建立

您可以處理 AddingNew 事件,以提供您自己的項目建立邏輯。 AddingNew 事件會在新的物件加入至 BindingSource 之前發生。 呼叫 AddNew 方法之後,但在將新項目新增至基本清單之前,就會引發此事件。 藉由處理此事件,您可以提供自訂項目建立行為,而不衍生自 BindingSource 類別。 如需詳細資訊,請參閱操作說明:使用 Windows Forms BindingSource 自訂加入項目

交易式項目建立

BindingSource 元件會實作可建立交易式項目的 ICancelAddNew 介面。 使用呼叫 AddNew 暫時建立新項目之後,可能會以下列方式認可或回復新增項目:

  • EndNew 方法會明確認可擱置的新增。

  • 執行另一個收集作業,例如插入、移除或移動,將會隱含地認可擱置的新增作業。

  • 如果方法尚未認可,則 CancelNew 方法會回復暫止的加法。

IEnumerable 支援

BindingSource 元件可啟用 IEnumerable 資料來源的繫結控制項。 透過此元件,您可以繫結至資料來源,例如 System.Data.SqlClient.SqlDataReader

IEnumerable 資料來源指派給 BindingSource 元件時,BindingSource 會建立 IBindingList,並將 IEnumerable 資料來源的內容新增至清單。

設計階段支援

某些物件類型無法在設計時間建立,例如從處理站類別建立的物件,或 Web 服務傳回的物件。 您有時可能需要在設計時間將控制項繫結至這些類型,即使記憶體中沒有控制項可以繫結的物件也一樣。 例如,您可能需要使用自訂類型公用屬性的名稱,為 DataGridView 控制項的資料行標頭加上標籤。

為了支援此案例,BindingSource 元件支援繫結至 Type。 您將 Type 指派給 DataSource 屬性時,BindingSource 元件會建立 Type 項目的空白 BindingList<T>。 您後續繫結至 BindingSource 元件的任何控制項,都會在設計時間或執行階段收到您類型的屬性或架構是否存在警示。 如需詳細資訊,請參閱操作說明:將 Windows Forms 控制項繫結至類型

Static ListBindingHelper 方法

System.Windows.Forms.BindingContextSystem.Windows.Forms.CurrencyManagerBindingSource 類型全都會共用通用邏輯,以便從 DataSource/DataMember 配對產生清單。 此外,此常見邏輯會在下列 static 方法中公開供控制項作者和其他第三方使用:

使用 IBindingListView 介面排序和篩選

BindingSource 元件會實作可擴充 IBindingList 介面的 IBindingListView 介面。 IBindingList 提供單一資料行排序,而 IBindingListView 則提供進階的排序和篩選。 使用 IBindingListView,如果資料來源也實作其中一個介面,您可以排序和篩選資料來源中的項目。 BindingSource 元件不提供這些成員的參考實作。 相反地,呼叫會轉送至基本清單。

下表描述用於排序和篩選的屬性。

member 描述
Filter 屬性 如果資料來源是 IBindingListView,可取得或設定用來篩選所檢視之資料列的運算式。
Sort 屬性 如果資料來源是 IBindingList,可取得或設定用來排序的資料行名稱,以及排序次序資訊。

-或-

如果資料來源是 IBindingListView 並支援進階排序,可取得用來排序的多個資料行名稱,以及排序次序

與 BindingNavigator 整合

您可以使用 BindingSource 元件,將任何 Windows Forms 控制項繫結至資料來源,但 BindingNavigator 控制項是專為使用 BindingSource 元件所設計。 BindingNavigator 控制項提供使用者介面來控制 BindingSource 元件的目前項目。 根據預設,BindingNavigator 控制項會提供對應至 BindingSource 元件上導覽方法的按鈕。 如需詳細資訊,請參閱操作說明:使用 Windows Forms BindingNavigator 控制項瀏覽資料

另請參閱