介绍
在 C# 中,CheckedListBox 是 Windows 窗体(WinForms)中的一个控件,它结合了列表框(ListBox)和复选框(CheckBox)的功能,允许用户从列表中选择一个或多个项(支持多选)。每个项旁边都有一个复选框,用户可以通过勾选/取消勾选来选择项。
一、基本功能
1. 添加 CheckedListBox 控件
在 WinForms 设计器中,从工具箱拖拽 CheckedListBox 到窗体上,或通过代码动态创建:
// 动态创建 CheckedListBox
CheckedListBox checkedListBox1 = new CheckedListBox();
checkedListBox1.Dock = DockStyle.Fill; // 填充窗体
this.Controls.Add(checkedListBox1); // 添加到窗体
2. 添加列表项
可以通过设计器的 Items 属性添加项,或通过代码添加:
// 方法1:直接添加字符串
checkedListBox1.Items.Add("选项1");
checkedListBox1.Items.Add("选项2");
checkedListBox1.Items.Add("选项3");
// 方法2:添加自定义对象(需重写 ToString() 显示文本)
checkedListBox1.Items.Add(new MyItem(1, "自定义选项1"));
checkedListBox1.Items.Add(new MyItem(2, "自定义选项2"));
// 自定义类示例
public class MyItem
{
public int Id { get; set; }
public string Name { get; set; }
public MyItem(int id, string name)
{
Id = id;
Name = name;
}
// 重写 ToString() 以在列表中显示文本
public override string ToString() => Name;
}
3. 设置选择模式
此属性控制的是 高亮选中(选蓝),不是 复选状态,即:不是指勾选多个复选框
CheckedListBox 支持多种选择模式(通过 SelectionMode 属性),常用模式:
SelectionMode.One:只能选蓝一项SelectionMode.MultiSimple:可通过点击或空格键选中多项(无快捷键)。SelectionMode.MultiExtended:支持Ctrl/Shift快捷键多选(默认值)。
checkedListBox1.SelectionMode = SelectionMode.MultiSimple; // 简单多选模式
二、获取选中的项
CheckedListBox 中 选中 有两种含义:
复选框勾选状态:通过
CheckedItems或GetItemChecked(index)获取。高亮选中状态(选蓝):通过
SelectedItems或SelectedIndices获取(类似ListBox)。
通常关注复选框勾选的项
1. 遍历所有勾选的项(CheckedItems)
// 按钮点击事件:获取所有勾选的项
private void button1_Click(object sender, EventArgs e)
{
// 遍历 CheckedItems(仅包含勾选的项)
foreach (var item in checkedListBox1.CheckedItems)
{
// 若为字符串项
if (item is string str)
{
Console.WriteLine("勾选项:" + str);
}
// 若为自定义对象
else if (item is MyItem myItem)
{
Console.WriteLine($"勾选项:ID={myItem.Id}, Name={myItem.Name}");
}
}
}
1. 遍历所有勾选的项的索引(CheckedIndices)
// 按钮点击事件:获取所有勾选的项
private void button1_Click(object sender, EventArgs e)
{
// 遍历 CheckedItems(仅包含勾选的项)
foreach (var item in checkedListBox1.CheckedIndices)
{
Console.WriteLine("勾选项的索引:" + item);
}
}
3. 通过索引判断是否勾选(GetItemChecked)
// 遍历所有项,判断是否勾选
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
if (checkedListBox1.GetItemChecked(i)) // 判断第 i 项是否勾选
{
var item = checkedListBox1.Items[i];
Console.WriteLine($"索引 {i} 的项被勾选:{item}");
}
}
三、设置项的勾选状态
通过代码勾选或取消勾选项:
// 方法1:通过索引设置(第 0 项勾选,第 1 项取消勾选)
checkedListBox1.SetItemChecked(0, true); // 勾选
checkedListBox1.SetItemChecked(1, false); // 取消勾选
// 方法2:通过项对象设置(需先找到索引)
int index = checkedListBox1.Items.IndexOf("选项3");
if (index != -1)
{
checkedListBox1.SetItemChecked(index, true);
}
// 方法3:全选/全不选
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
checkedListBox1.SetItemChecked(i, true); // 全选
// checkedListBox1.SetItemChecked(i, false); // 全不选
}
四、事件响应
CheckedListBox 常用事件:
ItemCheck:当项的勾选状态即将改变时触发(可在此时获取旧状态和新状态)。SelectedIndexChanged:当高亮选中的项变化时触发(类似ListBox)。
示例:ItemCheck 事件
// 注册事件(设计器或代码中)
checkedListBox1.ItemCheck += CheckedListBox1_ItemCheck;
// 事件处理方法
private void CheckedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
// e.Index:发生变化的项的索引
// e.CurrentValue:当前状态(Checked/Unchecked/Indeterminate)
// e.NewValue:即将设置的状态
var item = checkedListBox1.Items[e.Index];
Console.WriteLine($"项 {item} 的状态即将从 {e.CurrentValue} 变为 {e.NewValue}");
}
五、关键属性
| 属性 | 说明 |
|---|---|
Items |
列表中的所有项(ObjectCollection) |
CheckedItems |
所有被勾选的项(CheckedItemCollection) |
CheckOnClick |
设为 true 时,点击项直接切换勾选状态(默认需点击复选框) |
SelectionMode |
选择模式(控制高亮选中行为) |
CheckedIndices |
所有被勾选项的索引(CheckedIndexCollection) |
总结
CheckedListBox 适合需要用户从列表中选择多个选项的场景,核心操作包括:
- 添加项(支持字符串或自定义对象)。
- 通过
CheckedItems或GetItemChecked获取勾选项。 - 通过
SetItemChecked设置勾选状态。 - 响应
ItemCheck事件处理状态变化。
根据实际需求配置选择模式和事件,可实现灵活的多选功能。
