Введение
CheckedListBox - это компонент Windows Forms, который отображает список элементов с флажками для выбора. Пользователь может выбрать несколько элементов одновременно.
Основное применение: выбор нескольких элементов из списка, настройки приложения, фильтрация данных.
Основные свойства
-
Items
Коллекция элементов списка
-
CheckedItems
Коллекция выбранных элементов
-
CheckedIndices
Коллекция индексов выбранных элементов
-
CheckOnClick
Выделение по одному клику
-
SelectionMode
Режим выбора элементов
Создание и настройка
Добавление элементов
private CheckedListBox checkedListBox1 = new CheckedListBox();
checkedListBox1.Items.Add("Элемент 1");
checkedListBox1.Items.Add("Элемент 2");
checkedListBox1.Items.Add("Элемент 3");
checkedListBox1.Items.AddRange(new string[] {
"C# Programming",
"Database Design",
"Web Development"
});
checkedListBox1.CheckOnClick = true;
checkedListBox1.MultiColumn = false;
Обработка событий
ItemCheck - изменение состояния
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
string item = checkedListBox1.Items[e.Index].ToString();
if (e.NewValue == CheckState.Checked) {
MessageBox.Show($"Выбран: {item}");
} else {
MessageBox.Show($"Снят выбор: {item}");
}
}
SelectedIndexChanged - выбор элемента
private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) {
if (checkedListBox1.SelectedIndex != -1) {
string selectedItem = checkedListBox1.SelectedItem.ToString();
label1.Text = $"Выбран элемент: {selectedItem}";
}
}
Работа с выбранными элементами
Получение выбранных элементов
foreach (var item in checkedListBox1.CheckedItems) {
listBoxResults.Items.Add($"Выбран: {item}");
}
foreach (int index in checkedListBox1.CheckedIndices) {
string item = checkedListBox1.Items[index].ToString();
listBoxResults.Items.Add($"Индекс {index}: {item}");
}
var selectedItems = checkedListBox1.CheckedItems
.Cast<string>().ToList();
Управление состоянием
for (int i = 0; i < checkedListBox1.Items.Count; i++) {
checkedListBox1.SetItemChecked(i, true);
}
for (int i = 0; i < checkedListBox1.Items.Count; i++) {
checkedListBox1.SetItemChecked(i, false);
}
for (int i = 0; i < checkedListBox1.Items.Count; i++) {
bool isChecked = checkedListBox1.GetItemChecked(i);
checkedListBox1.SetItemChecked(i, !isChecked);
}
Пользовательские объекты
public class Product {
public string Name { get; set; }
public decimal Price { get; set; }
public override string ToString() {
return $"{Name} - {Price:C}";
}
}
var products = new List<Product> {
new Product { Name = "Ноутбук", Price = 50000 },
new Product { Name = "Мышь", Price = 1500 }
};
checkedListBox1.DataSource = products;
checkedListBox1.DisplayMember = "Name";
Практические примеры
Фильтрация элементов
string searchText = textBoxSearch.Text.Trim().ToLower();
for (int i = 0; i < checkedListBox1.Items.Count; i++) {
string item = checkedListBox1.Items[i].ToString().ToLower();
if (item.Contains(searchText)) {
checkedListBox1.SelectedIndex = i;
break;
}
}
Динамическое добавление
private void buttonAddItem_Click(object sender, EventArgs e) {
string newItem = textBoxNewItem.Text.Trim();
if (!string.IsNullOrEmpty(newItem) &&
!checkedListBox1.Items.Contains(newItem)) {
checkedListBox1.Items.Add(newItem);
textBoxNewItem.Clear();
}
}
Лучшие практики и советы
Важно: При удалении элементов всегда начинайте с конца списка, чтобы индексы не сбивались.
var indicesToRemove = checkedListBox1.CheckedIndices
.Cast<int>()
.OrderByDescending(i => i)
.ToList();
foreach (int index in indicesToRemove) {
checkedListBox1.Items.RemoveAt(index);
}
Производительность: При работе с большими списками используйте BeginUpdate() и EndUpdate() для предотвращения мерцания.
checkedListBox1.BeginUpdate();
for (int i = 0; i < 1000; i++) {
checkedListBox1.Items.Add($"Элемент {i}");
}
checkedListBox1.EndUpdate();