Как создать Combobox Winforms с меткой и стоимостью?
Я в основном разработчик ASP.NET, но я работаю над приложением WinForms и замечаю большую разницу между компиляцией ASP.NET(html select) и версией WinForms. Я обнаружил (возможно, неправильно), что в combobox WinForm есть только "метка", тогда как ASP.NET позволяет указать "метку" и "значение".
Я хочу использовать комбобокс WinForms (или другой сопоставимый элемент управления) с меткой и значением (Foobar/42329). Это возможно? Я попытался найти ответ, но не придумал много. Если этого не сделать, как это сделать, и разработать комбобокс WinForm, который будет представлять собой города с соответствующим идентификатором базы данных?
- Торонто /2324
- Монреаль /64547
- Ванкувер /1213
Ответы
Ответ 1
Я могу придумать несколько способов:
- переопределить
ToString()
класса City
до return Name + " / " + Id;
- то же, но с
TypeConverter
- добавьте свойство
DisplayText
, которое возвращает то же самое, и используйте DisplayMember
- построить класс прокладок для данных
Для последнего:
var data = cities.Select(city => new {
Id = city.Id, Text = city.Name + " / " + city.Id }).ToList();
cbo.ValueMember = "Id";
cbo.DisplayMember = "Text";
cbo.DataSource = data;
Ответ 2
Предполагая, что ваши значения уникальны, вы можете сначала заполнить словарь, а затем привязать combobox к словарю. К сожалению, для привязки данных требуется IList или IListSource, поэтому вам нужно обернуть его в Binding Source. Я нашел решение здесь.
private void PopulateComboBox()
{
var dict = new Dictionary<int, string>();
dict.Add(2324, "Toronto");
dict.Add(64547, "Vancouver");
dict.Add(42329, "Foobar");
comboBox1.DataSource = new BindingSource(dict, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";
}
Ответ 3
Вы можете попробовать создать небольшой класс с именем ComboBoxItem
, например:
public class ComboBoxItem<T>
{
public string Label { get; set; }
public T Value { get; set; }
public override string ToString()
{
return Label ?? string.Empty;
}
}
И тогда, когда вам нужно получить объект, просто добавьте его в ComboBoxItem
.
Ответ 4
A ComboBox может быть привязан к набору объектов, установив его свойство DataSource
.
По умолчанию свойство SelectedValue будет предоставлять объект, который был выбран, и список будет вызывать ToString
для каждого объекта и отображать результат.
Однако, если вы установите свойство DisplayMember для ComboBox, оно отобразит значение свойства, указанного в DisplayMember в списке. Аналогичным образом вы можете установить свойство ValueMember для ComboBox, а proeprty SelectedValue вернет значение свойства, названного ValueMember.
Следовательно, вам необходимо привязать ComboBox к списку объектов, у которых есть свойства Name
и Value
.
Затем вы можете установить для свойства ComboBox [ DisplayMember
свойство Name
и ValueMember
значение Value
.
EDIT. Вы также можете вызвать метод Add
и дать ему такой объект вместо привязки данных. В качестве альтернативы вы можете привязать его к List<T>
или массиву.
Ответ 5
Существует свойство, называемое DisplayMember
= имя свойства, значение которого будет использоваться для отображения, и ValueMember
, которое является свойством использования для значения.
Ответ 6
anestezi.DisplayMember = "Text";
anestezi.ValueMember = "Value";
anestezi.DataSource = new[] {
new { Text = "Genel", Value = "G" },
new { Text = "Lokal", Value = "L" },
new { Text = "Sedasyon", Value = "S" }
};
anestezi.SelectedIndex = 0;