什麼時候值得使用 BindingSource?
我想我非常了解 BindingSource 類的作用——即在數據源和 UI 控制項之間提供一個間接層。它實現了 IBindingList 介面,因此還提供了對排序的支持。而且我已經使用它足夠頻繁,沒有太多問題。但我想知道我是否經常使用它。也許一個例子會有所幫助。
假設我在表單上只有一個簡單的文本框(使用 WinForms),我想將該文本框綁定到返回字元串的類中的一個簡單屬性。在這種情況下是否值得使用 BindingSource?
現在假設我的表單上有一個網格,我想將它綁定到一個 DataTable。我現在應該使用 BindingSource 嗎?
在後一種情況下,我可能不會使用 BindingSource,因為我可以收集到的數據表提供與 BindingSource 本身相同的功能。當添加、刪除行等時,DataTable 將觸發正確的事件,以便網格自動更新。
但在文本框綁定到字元串的第一種情況下,我可能會讓包含字元串屬性的類實現 INotifyPropertyChanged,以便在字元串更改時觸發 PropertyChanged 事件。我將使用 BindingSource 以便它可以偵聽這些 PropertyChanged 事件,以便在字元串更改時自動更新文本框。
到目前為止聽起來如何?我仍然覺得我的理解存在差距,這使我無法看到整個畫面。到目前為止,這是一個相當模糊的問題,所以我會嘗試提出一些更具體的問題——理想情況下,答案將參考上述範例或類似的東西……
(1) 在上述任何一個範例中都值得使用 BindingSource 嗎?
(2) 似乎開發人員只是“假設”DataTable 類會做正確的事情,在正確的時間觸發 PropertyChanged 事件。如何知道數據源是否能夠做到這一點?為了讓開發人員能夠承擔這種行為,數據源是否應該實現特定的介面?
(3) 在考慮是否使用 BindingSource 時,綁定什麼 Control 是否重要?還是只有數據源會影響決策?也許答案是(這似乎很合乎邏輯):控制項需要足夠智能以偵聽 PropertyChanged 事件,否則需要 BindingSource。那麼如何判斷 Control 是否有能力做到這一點呢?同樣,開發人員是否可以尋找控制項必須實現的特定介面?
過去,正是這種困惑導致我總是使用 BindingSource。但我想更好地了解何時使用一個,以便我只在必要時這樣做。
嗨,我對這個主題也有一些困惑。
當我使用數據表時,它們實現了所有介面。
但是,我總是使用 bindingsource 來確定.. :)
我能想到的原因有一些
- 同一記錄集上的多個視圖。(即 2 個具有不同排序順序/過濾器的網格)
- 過濾,排序,同時不改變記錄本身的排序順序(過濾/排序)
- 出於性能原因,能夠暫時禁用綁定。(當表中有大的更新時,不要聽所有的 IXXChanged 事件)
- 如果沒有綁定源,IErrorprovider 從來沒有為我工作過,但這可能是我的錯。
很老的問題。奇怪為什麼到現在還沒有人回答。好的,我會嘗試分享我的經驗。
A
BindingSource不僅僅是一種將控制項綁定到集合的方法。在 WinForms 工作了十多年後BindingSource,我最喜歡的最佳功能包括:
- 綁定(當然!)
- 貨幣管理(我稍後會談到)
- A
BindingSource可以充當另一個的數據源BindingSource。為了充分了解這些特性,我將在 DataSet 的上下文中對其進行解釋,這是迄今為止 WinForms 中使用的最常見的數據源類型,尤其是在業務線應用程序中。
貨幣管理歸結為目前記錄的概念。A
DataTable只是 s 的集合,即DataTablesDataRow中沒有*目前記錄的概念。*情況也是如此DataView(順便說一句,您不能直接綁定到 aDataTable;當您這樣做時,它實際上綁定到 that 的DefaultView屬性,即DataTableaDataView。您也可以創建自己的DataView)。在 Master/Detail 類型的 UI 中,貨幣管理確實很方便。因此,假設您
ListBox在左窗格(Master)中有一個學生,在右窗格中有幾個 TextBoxes、ComboBoxes、CheckBoxes 等,以及一個選定學生課程的網格(Detail)。在您的數據集中,您有兩個名為Student和的數據表Courses。為了簡單起見,我在這裡避免使用動名詞(Student_Course)。該Course表有一個外鍵StudentID。這是您在此處設置綁定的方式(請注意我上面列出的所有 3 個功能如何在下面的設置中使用):
- 將兩個
BindingSource控制項添加到您的表單中,名為bsStudent和bsCourses。- 設置
DataSource為DataTablebsStudent。Student- 設置
DataSource為bsCoursesbsStudent!- 在該
DataMember屬性中,您將看到存在於我們兩個表之間的 DataSet 中的關係的名稱。選擇它!- 將單個原子控制項的綁定設置為
bsStudent的屬性。- 設置
DataSource課程網格 bsCourses。你完成了。無需編寫任何程式碼(可以這麼說),您就成功地創建了主從視圖。BindingSource 控制項現在將處理學生列表中的目前記錄,不僅更新原子控制項(文本框、組合框等),還更新課程網格,這將自動更新其內容以顯示目前所選學生的課程。
我的朋友,這就是我最喜歡的 BindingSource 的作用(以及其他不錯的功能,如排序、過濾等)。在不涉及
BindingSource控制項和數據儲存之間的情況下,您將沒有目前記錄的概念,因此必須手動管理使所有 UI 保持同步。