Как создать комбинированный ящик Winforms с меткой и значением? - PullRequest
37 голосов
/ 07 января 2010

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

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

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

Ответы [ 6 ]

49 голосов
/ 07 января 2010

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

  • переопределить 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;
38 голосов
/ 07 января 2010

Предполагая, что ваши значения уникальны, вы можете сначала заполнить словарь, а затем связать комбинированный список со словарем. К сожалению, для привязки данных требуется 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";
    }
6 голосов
/ 07 января 2010

Вы можете попробовать создать небольшой класс с именем 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 голосов
/ 07 января 2010

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

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


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

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

1 голос
/ 03 ноября 2015
        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;
1 голос
/ 07 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...