Сегодня я решил сделать небольшую заметку о том как добавить в элементы управления формы 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. Хранить в списках можно и более тяжелые сложные объекты, все зависит от Вашей фантазии и конкретной задачи.