Я - главным образом разработчик ASP.NET, но я работаю над приложением WinForms и заметил значительные различия между полем комбинированного списка ASP.NET (выбор HTML) и тем из WinForms. Я нашел (возможно, неправильно так), что поле комбинированного списка WinForm только имеет "маркировку", тогда как ASP.NET позволяет Вам указывать "маркировку" и "значение".
Я надеюсь использовать поле комбинированного списка WinForms (или другое сопоставимое управление) с маркировкой и значением (Foobar / 42329). Действительно ли это возможно? Я попытался искать ответ, но не придумал много. Если нет никакого способа выполнить это, как каждый идет вперед и разрабатывает поле комбинированного списка WinForm, которое представило бы, говорят что Города с их связанным идентификатором базы данных?
Я могу придумать несколько способов:
ToString()
класса City
на return Name + " / " + Id;
TypeConverter
DisplayText
, которое вернет то же самое, и использовать DisplayMember
For the last:
var data = cities.Select(city => new {
Id = city.Id, Text = city.Name + " / " + city.Id }).ToList();
cbo.ValueMember = "Id";
cbo.DisplayMember = "Text";
cbo.DataSource = data;
Можно попробовать создать небольшой класс под названием ComboBoxItem
, например:
public class ComboBoxItem<T>
{
public string Label { get; set; }
public T Value { get; set; }
public override string ToString()
{
return Label ?? string.Empty;
}
}
А затем, когда нужно получить объект, просто сложите его в ComboBoxItem
.
ComboBox можно привязать к коллекции объектов, установив свойство DataSource
.
По умолчанию свойство SelectedValue дает выбранному объекту, а список вызывает ToString
по каждому объекту и отображает результат.
.
Однако, если вы установите свойство DisplayMember ComboBox, оно отобразит значение свойства с именем DisplayMember в списке. Аналогично, вы можете установить свойство ValueMember ComboBox, и функция SelectedValue вернет значение свойства с именем ValueMember.
Поэтому, вам необходимо связать ComboBox со списком объектов, которые имеют свойства Name
и Value
.
.
Затем вы можете установить свойство ComboBox [DisplayMember
на Name
и ValueMember
на Value
.
EDIT: Вы также можете вызвать метод Add
и дать ему такой объект вместо привязки к базе данных. Или же вы можете привязать его к List
или массиву.
Существует свойство под названием DisplayMember
= имя свойства, значение которого будет использоваться для отображения, и ValueMember
, которое является свойством, используемым для значения.
Предполагая, что Ваши значения уникальны, Вы можете сначала заполнить словарь, а затем привязать выпадающий список к словарю. К сожалению, для привязки баз данных требуется 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";
}