С# ComboBox с текстом и стоимостью

Возможный дубликат:
С# Winforms Combobox с меткой и стоимостью

Как подойти к хранению отображаемого значения и реального значения в ComboBox?

Т.е., ComboBox отображает:

  • Уничтожьте мир
  • Пожарная стрельба
  • Призыв Cthulhu

но получаемые значения:

  • с.в.
  • сс
  • СБН

Я хочу иметь возможность получить значение выбранного элемента способом, подобным этому:

string selectedValue = combobox1.SelectedValue

Обновлен код в ответ на ответы:

Dictionary<string, string> filterItems = new Dictionary<string, string>
{
    {"Destroy World", "dw"},
    {"Fire Slingshot", "fs"},
    {"Summon Cthulu", "sc"},
};
this.options_filterby.DataSource = new BindingSource(filterItems, null);
this.options_filterby.DisplayMember = "Key";
this.options_filterby.ValueMember = "Value";

Теперь по какой-то причине, хотя DisplayMembers абсолютно прекрасны, ValueMembers возвращают объекты словаря. Даже незнакомец, через некоторое время, ValueMembers вернет строки, как ожидалось.

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

Это возвращает словари в течение первых нескольких раз. Я изменяю выбранный элемент ComboBox, но в конечном итоге возвращает строки по мере необходимости.

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

В ответ на указанную выше проблему исправление заключается в том, чтобы установить свойства DisplayMember и ValueMember перед DataSource. Я предполагаю, что это ошибка. Код должен выглядеть следующим образом:

this.options_filterby.DisplayMember = "Key";
this.options_filterby.ValueMember = "Value";
this.options_filterby.DataSource = new BindingSource(filterItems, null);

Ответы

Ответ 1

Коллекция ComboBox.Items хранит значения объекта типа. Таким образом, он может хранить любой тип желаемого типа. Он генерирует отображаемое значение из метода ToString() объекта. Чтобы получить реальное значение, просто отбросьте объект к типу вашего класса.

Ответ 2

Вы используете DisplayMember и ValueMember, чтобы определить, что отобразит ComboBox, и что будет возвращено из SelectedValue. Когда вы устанавливаете свойство DataSource, ComboBox будет использовать свойство, описываемое DisplayMember, для отображения строки пользователю.


Что-то вроде этого

public class Item {
  string Name { get; set; }
  string Value { get; set; }
}

ComboBox box = new ComboBox();
box.DisplayMember = "Name";
box.ValueMember = "Value";
box.DataSource = new [] { new Item() { "Test", "test" } };

Если вы не установили ValueMember, вместо этого возвращается фактический элемент, и если вы не установите DisplayMember, метод items ToString() будет использоваться для получения строки, представленной пользователю.


Я не уверен, что это сработает или это может изменить то, что у вас есть, но вы можете попробовать хотя бы:) Дело в том, что я не уверен, что делает BindingSource, когда он получает словарь в качестве источника данных. Я полагаю, что он относится к нему как к IEnumerable<KeyValuePair<>>, хотя ваш код должен работать, но это не так, возможно, это будет..

BindingSource source = new BindingSource();
source.DataSource = typeof(KeyValuePair<string, string>);
foreach (KeyValuePair<string, string> pair in filterItems) {
    source.Add(pair);
}
options_filterby = source;