2011-04-27 35 views
1

我已經在我的WinForms應用程序的列表框。我希望它有作爲數據源字典的鍵,以便我做如下:.NET詞典按鍵作爲數據源列表框

IDictionary<Entity1, Entity2> myEntities = new Dictionary<Entity1, Entity2>(); 
myListBox.DataSource = myEntities.Keys; 

所以我得到的第二線以下錯誤:

Complex databinding accepts as a datasource either in Ilist or IListSource

  • 我已經嘗試了兩件不會做的事情:

    myListBox.DataSource =(IList < Entity1>)myEntities.Keys;

引發InvalidCastException異常:

Can't convert an object of type 'KeyCollection[Entity1,Entity2]' to type 'System.Collections.Generic.IList`1[Entity1]'.

  • AND和我也試着:

    myListBox.DataSource = myEntities.Keys.ToList < ENTITY1>();

但這樣,我失去了約束力,當我修改myEntitiesmyListBox.DataSource不會改變。

注意: excepton消息由我翻譯,所以他們可能不完全按照我寫的。

沒有辦法做到做到這一點?

謝謝!

回答

2
myListBox.DataSource = (from keys in myEntities.Keys 
         select keys) 
         .ToList(); 

第三次魅力。

好吧,

我相信你將不得不繼承詞典和覆蓋。新增的方法來觸發嘗試一個事件。在事件中,您將需要重新查詢字典鍵。根據資源,我發現(包括:How to Bind...)的詞典不會引發事件時,它的內容發生變化。

+0

同樣拋出'複雜數據綁定接受作爲數據源在Ilist或IListSource' – Diego 2011-04-27 19:41:49

+0

仍然是一個例外。 – Diego 2011-04-27 19:51:05

+0

我不得不啓動我的VS並將其解決......我不記得是否需要.AsEnumerable或.ToList – IAbstract 2011-04-27 19:52:38

0

使用

myListBox.DataSource = myEntities 
+0

我只需要綁定字典的鍵。 – Diego 2011-04-27 19:41:25

1

主要問題是您最終可能會將字典Keys用作數據源,但您沒有辦法通知數據源添加或刪除了字典中的元素。

這是因爲字典沒有任何通知的情況下爲,因此數據源不知道如何和何時你的字典裏發生了變化。已經存在於清單中的項目得到了他們的變化反映僅僅是因爲數據源保持對它們的引用,所以當他們改變的變化是顯而易見的,只要有保持的參照。

用於觸發您的字典的改變,因爲據我所知,你沒有太多的選擇:

  • 寫一些代碼,每次重新連接列表中的數據源添加或刪除的東西從所有的問題保留選定的項目等

  • 通過實施IBindingList或直接派生BindingList創建您自己的數據結構。

兩人都沒有容易的解決辦法,因此,如果您的實體都比較簡單,你可能要考慮一些替代品,如DataTables,可以存放複雜的密鑰和其他結構化數據。

+0

感謝您的答案。我必須考慮要做什麼。 – Diego 2011-04-27 21:30:00