2010-09-23 21 views
3

我想將業務對象列表綁定到Winforms控件(DataGridview,ComboBox,e.t.c)。WinForms:對象數據源使用最佳實踐

有幾種方法做到這一點:

我能爲業務對象創建包裝類和覆蓋其ToString方法實現。這對ComboBox,ListBox Items.(Add|AddRange)方法很有用。

但是這不適用於DataGridView。它要求ObjectDataSource在設計器模式下調整列。

由於應該有ObjectDataSources(用於DataGridViews)和包裝類,我決定只留下一種方法。 ObjectDataSource之一。

現在我有用於數據綁定的ObjectDataSources。當我使用嚮導時,它將屬性添加到我可以使用的窗體中,如下所示:

MyObjectDataSoure.DataSource = list-of-entities; 

填充底層winforms控件。但我也可以將實體列表直接分配給控制的數據源屬性,並且人口也是相同的。

MyWinformsControl.DataSource = list-of-entities 

是的,現在我沒有ObjectDataSource事件,但可能會有更一般的東西我想念?我應該避免聽winform事件(選擇已更改,用戶添加一行)並使用對象數據源?

什麼是使用對象數據源及其事件的最佳實踐?

預先感謝您!

回答

5

首先,不要將窗體窗體或控件直接綁定到數據對象。有幾個已知的錯誤(例如:https://connect.microsoft.com/VisualStudio/feedback/details/92260/datagrid-memory-leak-resulted-from-failed-clear-of-databind)涉及Windows窗體綁定機制在直接綁定下正確釋放對象失敗。相反,總是通過BindingSource進行綁定,如果它們在其他地方未被使用,這將允許您的對象被釋放以進行垃圾回收。

至於其他方面,我會建議保持綁定機制儘可能簡單,因爲你可以整體。如果您需要爲某些特定情況(例如DataGridView設計時支持)添加對象數據源,則只能針對這些情況進行操作。這些日子之一,你可能會最終使用一個沒有類似限制的替代網格控件,並且僅僅因爲你甚至沒有的問題而陷入一個過於複雜的整體綁定模式會很不方便了。

+0

謝謝你的迴應,妮可。我玩綁定來源,並有一個問題:是否有「beforeDelete」事件?我只能處理「afterDelete」。它看起來像綁定源提供了處理winControl - >底層數據源通信的一週能力。我想要有單一的方法來處理事件,但它看起來像bindingSources是不夠的。如果我使用DataGrid + listBox,我可以在dataGrid的bindingSource上處理刪除事件,但是必須在listBox上監聽「keyDowns」。 – 2010-09-25 04:26:44

+0

對不起,但我不認爲我明白你最後一條評論的意思。 BindingSource作爲實際數據源與控件或控件綁定之間相對透明的中間層。除了在綁定時間定位它,你根本不需要與它進行交互。您應該能夠繼續完全按照您已經在做的方式執行刪除操作。 – 2010-09-27 12:10:29