Как создать Поле комбинированного списка Winforms с Маркировкой и Значением?

Я - главным образом разработчик ASP.NET, но я работаю над приложением WinForms и заметил значительные различия между полем комбинированного списка ASP.NET (выбор HTML) и тем из WinForms. Я нашел (возможно, неправильно так), что поле комбинированного списка WinForm только имеет "маркировку", тогда как ASP.NET позволяет Вам указывать "маркировку" и "значение".

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

  • Торонто / 2324
  • Монреаль / 64547
  • Ванкувер / 1213
37
задан Alex Angas 24 March 2015 в 23:37
поделиться

5 ответов

Я могу придумать несколько способов:

  • переопределить ToString() класса City на return Name + " / " + Id;
  • ditto, но с помощью TypeConverter
  • добавить свойство DisplayText, которое вернет то же самое, и использовать DisplayMember
  • построить класс shim для данных

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;
49
ответ дан 27 November 2019 в 04:16
поделиться

Можно попробовать создать небольшой класс под названием ComboBoxItem, например:

public class ComboBoxItem<T>
{
    public string Label { get; set; }
    public T Value { get; set; }

    public override string ToString()
    {
        return Label ?? string.Empty;
    }
}

А затем, когда нужно получить объект, просто сложите его в ComboBoxItem.

.
6
ответ дан 27 November 2019 в 04:16
поделиться

ComboBox можно привязать к коллекции объектов, установив свойство DataSource .

По умолчанию свойство SelectedValue дает выбранному объекту, а список вызывает ToString по каждому объекту и отображает результат.
. Однако, если вы установите свойство DisplayMember ComboBox, оно отобразит значение свойства с именем DisplayMember в списке. Аналогично, вы можете установить свойство ValueMember ComboBox, и функция SelectedValue вернет значение свойства с именем ValueMember.


Поэтому, вам необходимо связать ComboBox со списком объектов, которые имеют свойства Name и Value.
. Затем вы можете установить свойство ComboBox [DisplayMember на Name и ValueMember на Value.

EDIT: Вы также можете вызвать метод Add и дать ему такой объект вместо привязки к базе данных. Или же вы можете привязать его к List или массиву.

.
4
ответ дан 27 November 2019 в 04:16
поделиться

Существует свойство под названием DisplayMember = имя свойства, значение которого будет использоваться для отображения, и ValueMember, которое является свойством, используемым для значения.

.
1
ответ дан 27 November 2019 в 04:16
поделиться

Предполагая, что Ваши значения уникальны, Вы можете сначала заполнить словарь, а затем привязать выпадающий список к словарю. К сожалению, для привязки баз данных требуется 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";
    }
38
ответ дан 27 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: