C#: ComboBox и ListBox добавление элементов с определением значения и текста

Сегодня я решил сделать небольшую заметку о том как добавить в элементы управления формы ComboBox, ListBox и другие схожие, значения в связке (значение — отображаемый текст), как это выглядит, например, в HTML…

Для тех кто не совсем понял о чем идет речь, поясню на примере HTML и элемента управления select. Например у нам нужно сделать список с текстом «Раз», «Два», «Три». При этом работая со списком мы хотим работать не со словами, а с числами. Тогда наш select будет выглядеть так:

<select>
<option value="1">Раз</option>
<option value="2">Два</option>
<option value="3">Три</option>
</select>

Таким образом, выбираем «Два», но значение элемента равно «2». Теперь перенесем данную задачу на язык программирования C#. У многих программистов в данном случае возникает небольшой ступор, так как элементы управления ComboBox и ListBox в методе добавления элементов в список принимают только один параметр, который является и значением, и отображаемым текстом. Однако в большинстве случаев, нам нужно разделять текст и значения.
Принцип работы с элементами управления формы типа ComboBox и ListBox похожи, поэтому рассмотрим пример только для ComboBox. Добавим элемент на форму, и в методе загрузки формы пропишем:

private void Form1_Load(object sender, EventArgs e)
{
   this.comboBox1.Items.Add("Раз");
   this.comboBox1.Items.Add("Два");
   this.comboBox1.Items.Add("Три");
   this.comboBox1.SelectedIndex = 1;
   MessageBox.Show(this.comboBox1.SelectedItem.ToString());
}

Если запустить проект, то мы увидим сообщение «Два», затем откроется форма с выпадающем списком и значениями «раз», «два», «три».
Теперь сделаем так, чтобы при запуске программы, нам показывалось сообщение с цифрой два, при этом внешний вид списка не изменился.
Для этого сначала придется создать новый класс (или структуру). В которой мы будем хранить нужные данные, а именно пару (значение — отображаемый текст):

class SelectData
{
        public readonly int Value;
        public readonly string Text;

        public SelectData(int Value, string Text)
        {
            this.Value = Value;
            this.Text = Text;
        }

        public override string ToString()
        {
            return this.Text;
        }
}


В целом класс примитивен, а ключевую роль играет перегруженный метод ToString(), который определяет как будет отображаться переменная нашего класса при попытке преобразовать ее в строку. Как видно из примера, в данном случае наша переменная превращается в значение атрибута Text.
Атрибут Items элемента СomboBox таков, что в качестве параметра метода Add получает объект, а объект — это база для всего, поэтому наш класс SelectData спокойно подойдет. Прорисовка элементов списка Items на форме, такова, что каждый объект, переводится в строку (тут как раз и работает метод ToString).
Имеем:

private void Form1_Load(object sender, EventArgs e)
{
    this.comboBox1.Items.Add(new SelectData(1, "Раз"));
    this.comboBox1.Items.Add(new SelectData(2, "Два"));
    this.comboBox1.Items.Add(new SelectData(3, "Три"));
    this.comboBox1.SelectedIndex = 1;
    //this.comboBox1.SelectedItem - это объект, программа не знает что это за объект, поэтому нам нужно
    //явно указать что это объект класса SelectData, а дальше работать с ним как с классом
    int selectedValue = ((SelectData)this.comboBox1.SelectedItem).Value;
    MessageBox.Show(selectedValue.ToString());
}

Вот и все. Теперь при запуске программы мы увидим сообщение с цифрой 2. Хранить в списках можно и более тяжелые сложные объекты, все зависит от Вашей фантазии и конкретной задачи.

Запись опубликована в рубрике C# с метками , , , , , , , , , , , , , , . Добавьте в закладки постоянную ссылку.