C#
Как вывести другое слово в ComboBox на C#
В C# WinForms в ComboBox можно показывать пользователю один текст, а в коде хранить другое значение. Для этого используйте объекты и свойства DisplayMember и ValueMember. Например, пользователь видит название категории, а программа получает ее Id
Пример задачи
Допустим, есть категории:
1— Ноутбуки;2— Смартфоны;3— Аксессуары.
В выпадающем списке нужно показать слова, а при выборе получить число. Если хранить только строки, потом придется вручную искать, какая строка какому коду соответствует. Лучше сразу передать в ComboBox список объектов
Создайте класс
public class Category
{
public int Id { get; set; }
public string Title { get; set; } = "";
}
Title будет отображаться пользователю. Id останется внутренним значением
Заполните ComboBox
Например, в событии загрузки формы:
private void Form1_Load(object sender, EventArgs e)
{
List<Category> categories = new()
{
new Category { Id = 1, Title = "Ноутбуки" },
new Category { Id = 2, Title = "Смартфоны" },
new Category { Id = 3, Title = "Аксессуары" }
};
comboBox1.DataSource = categories;
comboBox1.DisplayMember = "Title";
comboBox1.ValueMember = "Id";
}
Теперь ComboBox показывает Title, но выбранное значение можно получить через SelectedValue
Получите другое значение
private void showButton_Click(object sender, EventArgs e)
{
int categoryId = (int)comboBox1.SelectedValue;
label1.Text = $"Выбрана категория с Id: {categoryId}";
}
На экране пользователь выбирает слово, а программа работает с числом. Это удобно для базы данных, фильтров, заказов и любых справочников
Если нужно показать другой текст после выбора
Можно обработать SelectedIndexChanged:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedItem is Category category)
{
resultLabel.Text = $"Категория: {category.Title}, код: {category.Id}";
}
}
Здесь SelectedItem — сам объект Category, а не просто строка
Проверка выбора
Перед использованием выбранного значения проверьте, что оно есть:
if (comboBox1.SelectedItem is not Category category)
{
MessageBox.Show("Выберите категорию");
return;
}
label1.Text = category.Title;
Такая проверка спасает, если список пустой, данные еще не загрузились или пользователь не выбрал элемент. Особенно это важно, когда ComboBox заполняется из файла, базы данных или API
Вариант через ToString
Если не задавать DisplayMember, ComboBox попробует вывести результат метода ToString(). Можно переопределить его:
public override string ToString()
{
return Title;
}
Но для форм со справочниками DisplayMember и ValueMember обычно понятнее. Они явно показывают, какое поле отображается, а какое считается значением
Если после привязки вместо названий вы видите имя класса, значит DisplayMember не задан или задан с ошибкой в названии свойства. Например, DisplayMember = "Name" не сработает, если в классе свойство называется Title
Частые ошибки
Первая ошибка — добавлять строки вручную, а потом пытаться восстановить Id по тексту. Вторая — задать ValueMember до DataSource и запутаться в порядке инициализации. Третья — приводить SelectedItem к строке, хотя там лежит объект. Четвертая — не проверять, что выбор вообще сделан
Мини-задача: создайте список городов с Id и Name. Покажите в ComboBox названия городов, а по кнопке выведите в Label выбранный Id. Затем добавьте обработчик, который сразу показывает выбранный город при смене значения
Что почитать дальше по C#
- Классы и свойства в C#: первый пример
- List, Dictionary и LINQ в C#
- C# и .NET Framework: что выбрать новичку
- Рубрика C#
Что почитать дальше по C#
Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:
- C# с нуля: первый проект через dotnet new
- Как вывести сообщение об ошибке в C#
- Как создать форму в си шарп: первый Windows Forms пример
- Как установить .NET SDK для C#