2011-08-17 99 views
0

我有兩個列表。第一個是硬編碼的,內容不會改變。第二個可以由用戶進行編輯,以添加,修改和刪除項目:將組合框綁定到C中的兩個列表中#

public List<Item> DefaultItems = new List<Item>(); 
public BindingList<Item> UserItems = new BindingList<Item>(); 
... 
MyTable.DataSource = UserItems; 

我想結合這兩個列表,一前一後的內容,到一個ComboBox,並把它當用戶自動更新編輯UserItems列表。

第一部分我可以很容易地像解決:

public List<Items> AllItems 
{ 
    get 
    { 
     List<Item> Items = new List<Item>(); 
     foreach (Item I in DefaultItems) Items.Add(I); 
     foreach (Item I in UserItems) Items.Add(I); 
     return Items; 
    } 
} 
... 
MyComboBox.DataSource = AllItems; 

的問題是,當UserItems改變沒有通知AllItems已經更改,因此該組合框的內容保持不變。

然後我添加了UserItems更改時生成的事件。現在我的問題是如何強制ComboBox刷新。執行以下操作:

MyComboBox.DataSource = null; 
MyComboBox.DataSource = AllItems; 

導致selectedItem屬性成爲空及的selectedIndex成爲-1,然後我在我的代碼來處理(暫時記憶當前的項目,之後,將其還原等)。這一切都變得非常混亂,我相信有一個解決這個問題的巧妙方法。在那兒?

感謝,安迪

更新:我不想在第三方組件的形式還添加更多的代碼和複雜性只是爲了這一點,所以我只是用我凌亂的方式繼續。謝謝。

回答

2

您需要使用一個集合,以便在集合發生更改時通知UI。

你可以使用.NET提供的BindingList類,或者如果你想嘗試不同的東西,你可以下載BindingListView類來包裝你現有的集合,併爲UI提供它需要的通知。

+0

我將AllItems列表更改爲BindingList,但沒有任何區別。我認爲這是因爲添加/更改/刪除操作不在該列表上發生,而是在不同的列表上。 – Andy

+0

@安迪 - 那會是正確的。必須對BindingList進行更改。這就是爲什麼我建議看一下BindingListView。 –

+0

爲什麼不AllItems.ResetBindings();在這裏工作?它應該引發listchanged事件並使組合框刷新,但事實並非如此。似乎是完美的解決方案。 – Andy

相關問題