BindingSource 元件架構

透過 BindingSource 元件,您可以將所有 Windows Forms 控制項普遍繫結至資料來源。

元件可簡化控制項繫結至資料來源的過程,並提供下列相較於傳統資料繫結的優勢:

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

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

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

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

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

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

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

BindingSource 功能

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

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

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

間接

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

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

貨幣管理

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

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

CurrencyManager 屬性 取得與 BindingSource相關聯的貨幣管理員。

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

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

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

EndEdit 方法將待處理的變更套用至基礎數據源。

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

資料來源為列表

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

當 BindingSource 元件附加至資料來源時,它會將資料來源呈現為清單。

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

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

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

BindingSource 作為 IBindingList

BindingSource 元件提供成員以便作為 IBindingList 來存取和操作基礎資料。 下表會介紹其中一些成員。

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

自訂項目建立

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

交易式項目建立

BindingSource 元件實作了 ICancelAddNew 介面,這能夠實現交易項目的建立。 使用呼叫 AddNew 暫時建立新項目之後,新增可能會以下列方式提交或還原:

  • EndNew 方法會明確提交擱置中的新增。

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

  • 如果方法尚未被提交,則 CancelNew 方法會回滾暫定的新增。

IEnumerable 的支援

<a href="/dotnet/api/system.windows.forms.bindingsource" class="no-loc" data-linktype="absolute-path">BindingSource</a> 元件用來使控制項與 <a href="/dotnet/api/system.collections.ienumerable" class="no-loc" data-linktype="absolute-path">IEnumerable</a> 資料來源綁定。 透過此元件,您可以繫結至資料來源,例如 System.Data.SqlClient.SqlDataReader。

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

設計時期支援

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

為了支援此案例,BindingSource 元件支援繫結至 Type。 當您將 Type 指派給 DataSource 屬性時,BindingSource 元件會建立空的 BindingList<T>,這包含Type項目。 您後續繫結至 BindingSource 元件的任何控制項,都會在設計時間或執行階段獲得有關您的類型屬性或架構存在的通知。 如需詳細資訊,請參閱〈操作說明:將 Windows Forms 控制項繫結至類型〉。

Static ListBindingHelper 方法

、 和 類型全都會共用通用邏輯,以便從 配對產生清單。 此外,此通用邏輯會在以下 static 方法中公開,以供控制項作者與其他第三方使用:

使用 IBindingListView 介面排序和篩選

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

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

會員 說明
Filter 屬性 如果資料來源是 IBindingListView,可以取得或設定用於篩選哪些資料列被檢視的運算式。
Sort 屬性 如果資料來源是 IBindingList,可取得或設定用於排序的欄位名稱以及排序順序資訊。

-或-

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

與 BindingNavigator 整合

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

另請參閱