2013-04-03 45 views
4

我想一些項目添加到這樣的組合框添加到組合框和閱讀:怎麼項目(文本和值)的SelectedIndexChanged(的SelectedValue = NULL)

public class ComboboxItem 
{ 
    public string Text { get; set; } 
    public object Value { get; set; } 

    public override string ToString() 
    { 
     return Text; 
    } 
} 

ComboboxItem item = new ComboboxItem(); 
item.Text = "choose a server..."; 
item.Value = "-1"; 
ComboBox_Servers.Items.Add(item); 
... 

和閱讀這些文本和值SelectedIndexChanged像這樣:

private void ComboBox_Servers_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    MessageBox.Show(ComboBox_Servers.SelectedValue.ToString()); 
} 

但是SelectedValue始終爲空!有什麼問題,我該如何解決?

回答

7

您可以將SelectedItem轉換回您的class並訪問其properties

MessageBox.Show(((ComboboxItem)ComboBox_Countries_In_Silvers.SelectedItem).Value); 

編輯您可以嘗試使用DataTextField和DataValueField,我跟數據源使用它。

ComboBox_Servers.DataTextField = "Text"; 
ComboBox_Servers.DataValueField = "Value"; 
+0

感謝阿迪爾選擇的項目,它的工作原理。我怎麼做SelectedValue可行? – MoonLight

+0

然後,您可以嘗試使用類屬性和訪問值屬性設置DataTextField和DataValueField屬性。 – Adil

+0

你能在你的回答中告訴我嗎? – MoonLight

5

試試這個:

ComboBox cbx = new ComboBox(); 
cbx.DisplayMember = "Text"; 
cbx.ValueMember = "Value"; 

編輯(一點解釋,索裏,我還沒有注意到你的組合框沒有義務,我譴責缺乏咖啡因):

SelectedValue和SelectedItem之間的區別在這裏解釋得非常好:ComboBox SelectedItem vs SelectedValue

所以,如果你的combobox不是bou nd到數據源,DisplayMember和ValueMember不會執行任何操作,而SelectedValue將始終爲空,SelectedValueChanged將不會被調用。因此,無論你的綁定組合框:

  comboBox1.DisplayMember = "Text"; 
      comboBox1.ValueMember = "Value"; 

      List<ComboboxItem> list = new List<ComboboxItem>(); 

      ComboboxItem item = new ComboboxItem(); 
      item.Text = "choose a server..."; 
      item.Value = "-1"; 
      list.Add(item); 

      item = new ComboboxItem(); 
      item.Text = "S1"; 
      item.Value = "1"; 
      list.Add(item); 

      item = new ComboboxItem(); 
      item.Text = "S2"; 
      item.Value = "2"; 
      list.Add(item); 

      cbx.DataSource = list; // bind combobox to a datasource 

或使用SelectedItem屬性:

if (cbx.SelectedItem != null) 
      Console.WriteLine("ITEM: "+comboBox1.SelectedItem.ToString()); 
+0

DisplayMember不是沒有做任何事。在使用非數據綁定組合框時,DisplayMember屬性可以工作。這是非常混亂的,因爲人們會期望SelectedValue也可以工作。 – comecme

3
Dictionary<int,string> comboSource = new Dictionary<int,string>(); 
     comboSource.Add(1, "Sunday"); 
     comboSource.Add(2, "Monday"); 

Aftr adding values to Dictionary, use this as combobox datasource. 

     comboBox1.DataSource = new BindingSource(comboSource, null); 
     comboBox1.DisplayMember = "Value"; 
     comboBox1.ValueMember = "Key"; 
0
 combo1.DisplayMember = "Text"; 
     combo1.ValueMember = "Value"; 
     combo1.Items.Add(new { Text = "someText"), Value = "someValue") }); 
     dynamic item = combo1.Items[combo1.SelectedIndex]; 
     var itemValue = item.Value; 
     var itemText = item.Text; 

不幸 「combo1.SelectedValue」 不工作,我不想我的組合框綁定任何來源,所以我想出了這個解決方案。也許它會幫助別人。

2

這與其他一些答案類似,但是非常緊湊,並且可以避免在已經有列表的情況下轉換爲字典。

給定一個窗口的形式,並與string type屬性NameSomeClass上的ComboBox「組合框」,

List<SomeClass> list = new List<SomeClass>(); 

combobox.DisplayMember = "Name"; 
combobox.DataSource = list; 

這意味着combobox.SelectedItem是從list一個SomeClass對象,並在combobox每個項目將是顯示使用其屬性Name

您可以閱讀使用

SomeClass someClass = (SomeClass)combobox.SelectedItem; 
相關問題