Пара ключ-значение для ComboBox (WinForms)

В этой статье мы рассматриваем вариант для Windows Forms. Решение для WPF здесь.

После семи лет работы с PHP/JS/HTML я начал переходить в C# и первым удивлением для меня стало отсутствие быстрого решения вопроса выпадающих списков. В HTML/PHP это всё красиво. Пишем в атрибут value идентификатор, в содержимое тега — текст.

<select name="combobox">
    <option value="1">Soni</option>
    <option value="3">Sonsung</option>
    <option value="5">LC</option>
</select>

На обработку по умолчанию отправляется то, что написано в value, довольны все. Что мы видим в параметрах ComboBox?
В отличие от TreeView, в ComboBox не удастся использовать Tag, поскольку сам список визуально редактируется так:


А в коде это выглядит так:

comboBox1.Items.AddRange(new object[] {"Soni","Sonsung","LC"});

Однако, безвыходных ситуаций для нас нет и быть не может, поэтому начнем программировать.
Итак, мы имеем некий список:

id | value
----------
 1 | Soni
 3 | Sonsung
 5 | LC

Изначально нам нужно создать коллекцию:

using System.Collections.Generic;

/************** etc *****************/

Dictionary<int, string> comboBoxSource  = new Dictionary<int, string>(3);
//где 3 - количество элементов коллекции

И заполнить её значениями:

comboBoxSource.Add(1, "Soni");
comboBoxSource.Add(3, "Sonsung");
comboBoxSource.Add(5, "LC");

Вместо стандартного добавления элементов списка, превращаем нашу коллекцию в BindingSource для нашего ComboBox и задаем параметры отображения:

comboBox1.DataSource = new BindingSource(comboBoxSource, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";

Теперь, для того, чтобы получить выбранный элемент выпадающего списка, нужно обратиться к паре ключ-значение:

int selectedId = ((KeyValuePair<int, string>)comboBox1.SelectedItem).Key;

Для закрепления материала давайте напишем простейшую программу, которая при нажатии на кнопку выведет MessageBox с результатами выбранного элемента:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {
            //1. Создаем коллекцию
            Dictionary<int, string> comboBoxSource = new Dictionary<int, string>(3);
            //2. Заполняем её значениями
            comboBoxSource.Add(1, "Soni");
            comboBoxSource.Add(3, "Sonsung");
            comboBoxSource.Add(5, "LC");
            //3. Заполняем СomboBox
            comboBox1.DataSource = new BindingSource(comboBoxSource, null);
            comboBox1.DisplayMember = "Value";
            comboBox1.ValueMember = "Key";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Запоминаем выбранный ID
            int selectedId = ((KeyValuePair<int, string>)comboBox1.SelectedItem).Key;
            //Запоминаем выбранное значение
            string selectedText = ((KeyValuePair<int, string>)comboBox1.SelectedItem).Value;
            //Выводим результат на экран
            MessageBox.Show("Вы выбрали " + selectedText + ", ID " + selectedId, "Проверка");
        }
    }
}

Результат нажатия на кнопку:

Всем спасибо за внимание!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.