ComboBox:向项添加文本和值(无绑定源)

时间:2010-06-17 15:52:39

标签: c# winforms combobox

在C#WinApp中,如何将Text和Value添加到我的ComboBox项目中? 我做了一个搜索,通常答案是使用“绑定到源”..但在我的情况下,我的程序中没有准备好绑定源... 我怎么能这样做:

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

19 个答案:

答案 0 :(得分:331)

您必须创建自己的类类型并覆盖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());
}

答案 1 :(得分:176)

// Bind combobox to dictionary
Dictionary<string, string>test = new Dictionary<string, string>();
        test.Add("1", "dfdfdf");
        test.Add("2", "dfdfdf");
        test.Add("3", "dfdfdf");
        comboBox1.DataSource = new BindingSource(test, null);
        comboBox1.DisplayMember = "Value";
        comboBox1.ValueMember = "Key";

// Get combobox selection (in handler)
string value = ((KeyValuePair<string, string>)comboBox1.SelectedItem).Value;

答案 2 :(得分:110)

你可以使用这样的匿名类:

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

comboBox.Items.Add(new { Text = "report A", Value = "reportA" });
comboBox.Items.Add(new { Text = "report B", Value = "reportB" });
comboBox.Items.Add(new { Text = "report C", Value = "reportC" });
comboBox.Items.Add(new { Text = "report D", Value = "reportD" });
comboBox.Items.Add(new { Text = "report E", Value = "reportE" });

更新:虽然上面的代码会在组合框中正确显示,但您将无法使用SelectedValue的{​​{1}}或SelectedText属性。为了能够使用它们,绑定组合框如下:

ComboBox

答案 3 :(得分:25)

您应该使用dynamic对象在运行时解析组合框项目。

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

comboBox.Items.Add(new { Text = "Text", Value = "Value" });

(comboBox.SelectedItem as dynamic).Value

答案 4 :(得分:13)

这是我想到的方法之一:

combo1.Items.Add(new ListItem("Text", "Value"))

要更改项目的文本或值,您可以这样做:

combo1.Items[0].Text = 'new Text';

combo1.Items[0].Value = 'new Value';

Windows Forms中没有名为ListItem的类。它只存在于ASP.NET中,所以在使用之前你需要编写自己的类,就像@Adam Markowitz在his answer中所做的那样。

同时查看这些页面,它们可能有所帮助:

答案 5 :(得分:12)

您可以使用Dictionary对象而非创建自定义类,以便在Combobox中添加文字和值。

Dictionary对象中添加键和值:

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

将源Dictionary对象绑定到Combobox

comboBox1.DataSource = new BindingSource(comboSource, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";

检索密钥和值:

string key = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Key;
string value = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Value;

完整来源:Combobox Text nd Value

答案 6 :(得分:11)

不知道这是否适用于原帖中给出的情况(更不用说这是两年后的事实),但这个例子对我有用:

Hashtable htImageTypes = new Hashtable();
htImageTypes.Add("JPEG", "*.jpg");
htImageTypes.Add("GIF", "*.gif");
htImageTypes.Add("BMP", "*.bmp");

foreach (DictionaryEntry ImageType in htImageTypes)
{
    cmbImageType.Items.Add(ImageType);
}
cmbImageType.DisplayMember = "key";
cmbImageType.ValueMember = "value";

要重新读取您的值,您必须将SelectedItem属性强制转换为DictionaryEntry对象,然后您可以评估它的Key和Value属性。例如:

DictionaryEntry deImgType = (DictionaryEntry)cmbImageType.SelectedItem;
MessageBox.Show(deImgType.Key + ": " + deImgType.Value);

答案 7 :(得分:6)

//set 
comboBox1.DisplayMember = "Value"; 
//to add 
comboBox1.Items.Add(new KeyValuePair("2", "This text is displayed")); 
//to access the 'tag' property 
string tag = ((KeyValuePair< string, string >)comboBox1.SelectedItem).Key; 
MessageBox.Show(tag);

答案 8 :(得分:4)

我喜欢fab的回答,但我不想在我的情况下使用字典,所以我替换了一个元组列表。

// set up your data
public static List<Tuple<string, string>> List = new List<Tuple<string, string>>
{
  new Tuple<string, string>("Item1", "Item2")
}

// bind to the combo box
comboBox.DataSource = new BindingSource(List, null);
comboBox.ValueMember = "Item1";
comboBox.DisplayMember = "Item2";

//Get selected value
string value = ((Tuple<string, string>)queryList.SelectedItem).Item1;

答案 9 :(得分:3)

使用DataTable的示例:

DataTable dtblDataSource = new DataTable();
dtblDataSource.Columns.Add("DisplayMember");
dtblDataSource.Columns.Add("ValueMember");
dtblDataSource.Columns.Add("AdditionalInfo");

dtblDataSource.Rows.Add("Item 1", 1, "something useful 1");
dtblDataSource.Rows.Add("Item 2", 2, "something useful 2");
dtblDataSource.Rows.Add("Item 3", 3, "something useful 3");

combo1.Items.Clear();
combo1.DataSource = dtblDataSource;
combo1.DisplayMember = "DisplayMember";
combo1.ValueMember = "ValueMember";

   //Get additional info
   foreach (DataRowView drv in combo1.Items)
   {
         string strAdditionalInfo = drv["AdditionalInfo"].ToString();
   }

   //Get additional info for selected item
    string strAdditionalInfo = (combo1.SelectedItem as DataRowView)["AdditionalInfo"].ToString();

   //Get selected value
   string strSelectedValue = combo1.SelectedValue.ToString();

答案 10 :(得分:3)

您可以使用此代码将一些项目插入带有文本和值的组合框中。

<强> C#

private void ComboBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
    combox.Items.Insert(0, "Copenhagen");
    combox.Items.Insert(1, "Tokyo");
    combox.Items.Insert(2, "Japan");
    combox.Items.Insert(0, "India");   
}

<强> XAML

<ComboBox x:Name="combox" SelectionChanged="ComboBox_SelectionChanged_1"/>

答案 11 :(得分:3)

如果有人仍然对此感兴趣,这里有一个简单灵活的类,用于组合框项目,文本和任何类型的值(非常类似于Adam Markowitz的例子):

public class ComboBoxItem<T>
{
    public string Name;
    public T value = default(T);

    public ComboBoxItem(string Name, T value)
    {
        this.Name = Name;
        this.value = value;
    }

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

使用<T>比将value声明为object更好,因为使用object,您必须跟踪所使用的类型对于每个项目,并将其投射到您的代码中以正确使用它。

我已经在我的项目上使用它已经有一段时间了。这真的很方便。

答案 12 :(得分:1)

除了Adam Markowitz的答案之外,这是一种通用的方法(相对)简单地将组合框的ItemSource值设置为enums,同时向用户显示“描述”属性。 (你认为每个人都希望这样做,以便它是一个.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事件处理程序中,您需要根据ComboEnumItems类型中的每个Enum将组合框的来源设置为Enum的列表。这可以通过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";
    }

现在,用户将从用户友好的Descriptions列表中进行选择,但他们选择的内容将是您可以在代码中使用的enum值。 要在代码中访问用户的选择,comboBoxUserReadable.SelectedItem将是ComboEnumItemcomboBoxUserReadable.SelectedValue将是EMyEnum

答案 13 :(得分:1)

您可以使用通用类型:

public class ComboBoxItem<T>
{
    private string Text { get; set; }
    public T Value { get; set; }

    public override string ToString()
    {
        return Text;
    }

    public ComboBoxItem(string text, T value)
    {
        Text = text;
        Value = value;
    }
}

使用简单的int-Type的示例:

private void Fill(ComboBox comboBox)
    {
        comboBox.Items.Clear();
        object[] list =
            {
                new ComboBoxItem<int>("Architekt", 1),
                new ComboBoxItem<int>("Bauträger", 2),
                new ComboBoxItem<int>("Fachbetrieb/Installateur", 3),
                new ComboBoxItem<int>("GC-Haus", 5),
                new ComboBoxItem<int>("Ingenieur-/Planungsbüro", 9),
                new ComboBoxItem<int>("Wowi", 17),
                new ComboBoxItem<int>("Endverbraucher", 19)
            };

        comboBox.Items.AddRange(list);
    }

答案 14 :(得分:0)

我遇到了同样的问题,我所做的是添加一个新的ComboBox,其中只有相同索引中的值,然后是第一个,然后当我更改主体组合时,第二个中的索引会发生变化同时,然后我取第二个组合的值并使用它。

这是代码:

public Form1()
{
    eventos = cliente.GetEventsTypes(usuario);

    foreach (EventNo no in eventos)
    {
        cboEventos.Items.Add(no.eventno.ToString() + "--" +no.description.ToString());
        cboEventos2.Items.Add(no.eventno.ToString());
    }
}

private void lista_SelectedIndexChanged(object sender, EventArgs e)
{
    lista2.Items.Add(lista.SelectedItem.ToString());
}

private void cboEventos_SelectedIndexChanged(object sender, EventArgs e)
{
    cboEventos2.SelectedIndex = cboEventos.SelectedIndex;
}

答案 15 :(得分:0)

班级创建:

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);

        }

    }
}

答案 16 :(得分:0)

Visual Studio 2013就是这样做的:

单项:

comboBox1->Items->AddRange(gcnew cli::array< System::Object^  >(1) { L"Combo Item 1" });

多件物品:

comboBox1->Items->AddRange(gcnew cli::array< System::Object^  >(3)
{
    L"Combo Item 1",
    L"Combo Item 2",
    L"Combo Item 3"
});

无需进行课程覆盖或包含其他任何内容。是的,comboBox1->SelectedItemcomboBox1->SelectedIndex来电仍有效。

答案 17 :(得分:0)

这与其他一些答案类似,但是很紧凑,如果您已有列表,则可以避免转换为字典。

在Windows窗体上提供ComboBox“组合框”,并使用SomeClass类型属性string给出Name类,

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

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

这意味着SelectedItem是来自SomeClass的{​​{1}}对象,list中的每个项目都将使用其名称显示。

答案 18 :(得分:0)

对于Windows窗体,这是一个非常简单的解决方案,如果需要的话,最终值为(字符串)。物品&#39;名称将显示在组合框中,并且可以轻松比较所选值。

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();