如何将项目(文本和值)添加到ComboBox并在SelectedIndexChanged中读取它们(SelectedValue = null)

Sil*_*ght 4 c# combobox winforms

我想在这样的组合框中添加一些项目:

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);
...   
Run Code Online (Sandbox Code Playgroud)

并阅读这些文本和值,SelectedIndexChanged如下所示:

private void ComboBox_Servers_SelectedIndexChanged(object sender, EventArgs e)
{
    MessageBox.Show(ComboBox_Servers.SelectedValue.ToString());
}
Run Code Online (Sandbox Code Playgroud)

但是SelectedValue总是为null!问题是什么,我该如何解决?

Adi*_*dil 7

您可以将其SelectedItem转发并转发给您class并访问它properties.

 MessageBox.Show(((ComboboxItem)ComboBox_Countries_In_Silvers.SelectedItem).Value);
Run Code Online (Sandbox Code Playgroud)

编辑您可以尝试使用DataTextField和DataValueField,我将它与DataSource一起使用.

ComboBox_Servers.DataTextField = "Text";
ComboBox_Servers.DataValueField = "Value";
Run Code Online (Sandbox Code Playgroud)


Ari*_*rie 5

试试这个:

ComboBox cbx = new ComboBox();
cbx.DisplayMember = "Text";
cbx.ValueMember = "Value";
Run Code Online (Sandbox Code Playgroud)

编辑(一点点解释,sory,我也没注意到你的组合框没有绑定,我责怪缺少咖啡因):

这里解释了SelectedValue和SelectedItem之间的区别:ComboBox SelectedItem vs SelectedValue

因此,如果您的组合框未绑定到数据源,则DisplayMember和ValueMember不会执行任何操作,并且SelectedValue将始终为null,不会调用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
Run Code Online (Sandbox Code Playgroud)

或使用SelectedItem属性:

if (cbx.SelectedItem != null)
             Console.WriteLine("ITEM: "+comboBox1.SelectedItem.ToString());
Run Code Online (Sandbox Code Playgroud)