2013-04-23 41 views
3

還有就是下面的代碼:Combobox綁定到列表。添加新項列表不影響組合框

public partial class Form1 : Form 
{ 
    private List<string> names = new List<string> { "aa", "bb", "cc" }; 

    public Form1() 
    { 
     InitializeComponent(); 

     comboBox1.DataSource = names; 
     comboBox1.DisplayMember = "Name"; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     names.Add("dd"); 
    } 
} 

當我點擊我要添加新值源列表,並期望組合框按鈕將立即更新,包括值。但事實並非如此。爲什麼? 一般來說,連接列表到組合框最簡單的方法是什麼?添加/刪除列表中的項目直接影響組合框的方式是什麼?

回答

1

發生這種情況的原因是,當您的List更改時,沒有發生任何事件可通知ComboBox有關更改。使用ObservableCollection<string>而不是List<string>。這就像List,但有功能。 ObservableCollection<string>接口INotifyCollectionChanged, INotifyPropertyChanged接口,這些都是需要的事件。

+0

的ObservableCollection 不會自動更新任何組合框。 – clumpter 2013-04-23 19:42:08

+0

我認爲它必須解決你的問題。但無論如何,使用'BindingList '作爲@MAV – Javidan 2013-04-23 19:44:45

3

您還可以使用BindingList,當列表內容更改時引發ListChanged事件。

BindingList<string> names = new BindingList<string> { "aa", "bb", "cc" }; 

對於ObservableCollectionBindingList之間的差別看this答案,這比什麼我可以提供更好。


如果你必須保持數據在正常List你可以在一個BindingSource像這樣的包裝清單:

private BindingSource source; //property 
... 
    source = new BindingSource(names, ""); 
    comboBox1.DataSource = source; 

,然後添加到源:

source.Add("3"); 

BindingSource會將項目添加到基礎列表並引發ListChanged事件。

如果你不能使用的解決辦法,我想不出別的不僅僅是復位DataSource在更新列表:

names.Add("dd"); 
comboBox1.DataSource = null; 
comboBox1.DataSource = names; 
+0

+1的解決方案。它會適用於自定義類型嗎? – Javidan 2013-04-23 18:57:29

+0

@Javidan是的。但如果它是您正在更改的自定義類型成員,則不會引發事件。 (例如,如果你正在顯示一個名爲'name'的屬性,並且你改變了'name'的值)。 – MAV 2013-04-23 19:02:50

+0

我讀了你在解決方案中給出的鏈接,如果不是你的答案,我不會意識到這一點。謝謝 – Javidan 2013-04-23 19:42:53