ComboBox: добавление текста и значения к элементу (без источника привязки) - PullRequest
180 голосов
/ 17 июня 2010

В C # WinApp, как я могу добавить текст и значение к элементам моего ComboBox?Я выполнил поиск и обычно в ответах используется «Привязка к источнику» ... но в моем случае у меня нет готового источника привязки в моей программе ... Как я могу сделать что-то вроде этого:

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

Ответы [ 20 ]

334 голосов
/ 17 июня 2010

Вы должны создать свой собственный тип класса и переопределить метод 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());
}
175 голосов
/ 31 июля 2012
// 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;
111 голосов
/ 17 октября 2012

Вы можете использовать анонимный класс следующим образом:

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 или SelectedText свойства ComboBox. Чтобы использовать их, свяжите комбинированное окно, как показано ниже:

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

var items = new[] { 
    new { Text = "report A", Value = "reportA" }, 
    new { Text = "report B", Value = "reportB" }, 
    new { Text = "report C", Value = "reportC" },
    new { Text = "report D", Value = "reportD" },
    new { Text = "report E", Value = "reportE" }
};

comboBox.DataSource = items;
26 голосов
/ 27 сентября 2016

Вы должны использовать dynamic объект для разрешения элемента комбинированного списка во время выполнения.

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

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

(comboBox.SelectedItem as dynamic).Value
13 голосов
/ 17 июня 2010

Это один из способов, которые только что пришли на ум:

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 в его ответе .

Также проверьте эти страницы, они могут помочь:

12 голосов
/ 20 ноября 2014

Вы можете использовать Dictionary Object вместо создания пользовательского класса для добавления текста и значения в Combobox.

Добавление ключей и значений в Dictionary Object:

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

Привязать исходный объект словаря к 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;

Полный источник: Текст комбинированного списка и Значение

11 голосов
/ 06 июня 2012

Не знаю, сработает ли это для ситуации, описанной в оригинальном посте (не говоря уже о том, что это два года спустя), но этот пример работает для меня:

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 голосов
/ 31 января 2013
//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);
4 голосов
/ 05 апреля 2017

Если кому-то все еще интересно это, вот простой и гибкий класс для элемента комбинированного списка с текстом и значением любого типа (очень похоже на пример Адама Марковица):

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 вам придется отслеживать тип, который вы использовали для каждого элемента, и использовать его в своем коде, чтобы использовать его правильно.

Я уже давно использую его в своих проектах.Это действительно удобно.

4 голосов
/ 17 июля 2014

Мне понравился ответ 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...