Подтвердить что ты не робот

Как создать Combobox Winforms с меткой и стоимостью?

Я в основном разработчик ASP.NET, но я работаю над приложением WinForms и замечаю большую разницу между компиляцией ASP.NET(html select) и версией WinForms. Я обнаружил (возможно, неправильно), что в combobox WinForm есть только "метка", тогда как ASP.NET позволяет указать "метку" и "значение".

Я хочу использовать комбобокс WinForms (или другой сопоставимый элемент управления) с меткой и значением (Foobar/42329). Это возможно? Я попытался найти ответ, но не придумал много. Если этого не сделать, как это сделать, и разработать комбобокс WinForm, который будет представлять собой города с соответствующим идентификатором базы данных?

  • Торонто /2324
  • Монреаль /64547
  • Ванкувер /1213
4b9b3361

Ответ 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;