在c# WinApp中,我如何同时添加文本和值到我的组合框的项目? 我做了一个搜索,通常答案是使用“绑定到一个源”..但在我的情况下,我没有一个绑定源准备在我的程序… 我怎么做这样的事情:

combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"

当前回答

除了Adam Markowitz的回答之外,这里还有一种通用的方法(相对来说)简单地将组合框的ItemSource值设置为枚举,同时向用户显示“Description”属性。(您可能认为每个人都想这样做,这样它就会成为。net的一行程序,但事实并非如此,而且这是我发现的最优雅的方式)。

首先,创建这个简单的类,用于将任意Enum值转换为ComboBox项:

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

    public ComboEnumItem(Enum originalEnum)
    {
        this.Value = originalEnum;
        this.Text = this.ToString();
    }

    public string ToString()
    {
        FieldInfo field = Value.GetType().GetField(Value.ToString());
        DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
        return attribute == null ? Value.ToString() : attribute.Description;
    }
}

其次,在OnLoad事件处理程序中,您需要将组合框的源设置为基于枚举类型中的每个Enum的ComboEnumItems列表。这可以用Linq实现。然后设置DisplayMemberPath:

    void OnLoad(object sender, RoutedEventArgs e)
    {
        comboBoxUserReadable.ItemsSource = Enum.GetValues(typeof(EMyEnum))
                        .Cast<EMyEnum>()
                        .Select(v => new ComboEnumItem(v))
                        .ToList();

        comboBoxUserReadable.DisplayMemberPath = "Text";
        comboBoxUserReadable.SelectedValuePath= "Value";
    }

现在用户将从用户友好的描述列表中进行选择,但他们选择的将是您可以在代码中使用的枚举值。 要在代码中访问用户的选择,comboBoxUserReadable。SelectedItem将是ComboEnumItem和comboBoxUserReadable。SelectedValue将是EMyEnum。

其他回答

这类似于其他一些答案,但是很紧凑,如果已经有一个列表,就避免了转换到字典。

给定一个窗口窗体上的ComboBox“ComboBox”和一个具有字符串类型属性Name的类SomeClass,

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

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

这意味着SelectedItem是list中的SomeClass对象,并且组合框中的每个项目将使用其名称显示。

除了Adam Markowitz的回答之外,这里还有一种通用的方法(相对来说)简单地将组合框的ItemSource值设置为枚举,同时向用户显示“Description”属性。(您可能认为每个人都想这样做,这样它就会成为。net的一行程序,但事实并非如此,而且这是我发现的最优雅的方式)。

首先,创建这个简单的类,用于将任意Enum值转换为ComboBox项:

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

    public ComboEnumItem(Enum originalEnum)
    {
        this.Value = originalEnum;
        this.Text = this.ToString();
    }

    public string ToString()
    {
        FieldInfo field = Value.GetType().GetField(Value.ToString());
        DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
        return attribute == null ? Value.ToString() : attribute.Description;
    }
}

其次,在OnLoad事件处理程序中,您需要将组合框的源设置为基于枚举类型中的每个Enum的ComboEnumItems列表。这可以用Linq实现。然后设置DisplayMemberPath:

    void OnLoad(object sender, RoutedEventArgs e)
    {
        comboBoxUserReadable.ItemsSource = Enum.GetValues(typeof(EMyEnum))
                        .Cast<EMyEnum>()
                        .Select(v => new ComboEnumItem(v))
                        .ToList();

        comboBoxUserReadable.DisplayMemberPath = "Text";
        comboBoxUserReadable.SelectedValuePath= "Value";
    }

现在用户将从用户友好的描述列表中进行选择,但他们选择的将是您可以在代码中使用的枚举值。 要在代码中访问用户的选择,comboBoxUserReadable。SelectedItem将是ComboEnumItem和comboBoxUserReadable。SelectedValue将是EMyEnum。

这是一个非常简单的解决方案为windows窗体,如果所有需要的是最终值(字符串)。项目的名称将显示在组合框上,选择的值可以很容易地进行比较。

List<string> items = new List<string>();

// populate list with test strings
for (int i = 0; i < 100; i++)
            items.Add(i.ToString());

// set data source
testComboBox.DataSource = items;

并在事件处理程序上获取所选值的值(字符串)

string test = testComboBox.SelectedValue.ToString();

类创造:

namespace WindowsFormsApplication1
{
    class select
    {
        public string Text { get; set; }
        public string Value { get; set; }
    }
}

Form1代码:

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            List<select> sl = new List<select>();
            sl.Add(new select() { Text = "", Value = "" });
            sl.Add(new select() { Text = "AAA", Value = "aa" });
            sl.Add(new select() { Text = "BBB", Value = "bb" });
            comboBox1.DataSource = sl;
            comboBox1.DisplayMember = "Text";
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            select sl1 = comboBox1.SelectedItem as select;
            t1.Text = Convert.ToString(sl1.Value);

        }

    }
}

您必须创建自己的类类型并重写ToString()方法以返回所需的文本。下面是一个你可以使用的类的简单例子:

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

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

下面是它使用的一个简单例子:

private void Test()
{
    ComboboxItem item = new ComboboxItem();
    item.Text = "Item text1";
    item.Value = 12;

    comboBox1.Items.Add(item);

    comboBox1.SelectedIndex = 0;

    MessageBox.Show((comboBox1.SelectedItem as ComboboxItem).Value.ToString());
}