WinForms中CheckedListBox控件的全面教程
CheckedListBox是Windows Forms中用于多选功能的常用控件,通过复选框形式展示列表项,允许用户勾选或取消勾选多个选项。本教程将系统讲解其核心功能、代码实现及典型应用场景。
clb_test
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinForm之CheckedListBox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 遍历所有项,检查选中状态
for (int i = 0; i < clb_test.Items.Count; i++)
{
// 判断是否被选中
if (clb_test.GetItemChecked(i))
{
string selectedText = clb_test.GetItemText(clb_test.Items[i]);
MessageBox.Show($"选中: {selectedText}");
}
}
}
}
}
一、基础属性详解
1. 核心属性
-
CheckOnClick
控制单击行为:true
时单击项直接切换选中状态;false
时需双击切换(默认行为)。checkedListBox1.CheckOnClick = true; // 单击即切换
-
MultiColumn与ColumnWidth
实现多列布局:MultiColumn=true
时,通过ColumnWidth
指定列宽(像素)。checkedListBox1.MultiColumn = true; checkedListBox1.ColumnWidth = 100; // 每列宽度100px
-
SelectionMode
限制选择行为:仅支持None
(禁用选择)或One
(单选,但复选框可多选)。
二、数据操作方法
1. 动态数据管理
-
添加项
checkedListBox1.Items.Add("选项1"); // 添加单条 checkedListBox1.Items.AddRange(new string[] { "选项2", "选项3" }); // 批量添加
-
插入与删除
checkedListBox1.Items.Insert(1, "新插入项"); // 在索引1处插入 checkedListBox1.Items.Remove("选项2"); // 按值删除 checkedListBox1.Items.RemoveAt(0); // 按索引删除
-
数据绑定
支持绑定数据源(如DataTable):DataSet ds = GetData(); checkedListBox1.DataSource = ds.Tables[0]; checkedListBox1.DisplayMember = "Name"; // 显示字段 checkedListBox1.ValueMember = "ID"; // 值字段
2. 状态控制
-
获取选中项
// 遍历所有项,检查选中状态 for (int i = 0; i < checkedListBox1.Items.Count; i++) { if (checkedListBox1.GetItemChecked(i)) { string selectedText = checkedListBox1.GetItemText(checkedListBox1.Items[i]); Console.WriteLine($"选中: {selectedText}"); } }
-
设置选中状态
checkedListBox1.SetItemChecked(0, true); // 选中首项 checkedListBox1.SetItemCheckState(1, CheckState.Indeterminate); // 设置为不确定状态
三、事件处理
1. 核心事件
-
ItemCheck
勾选状态变化时触发,可通过e.NewValue
获取新状态:private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) { if (e.NewValue == CheckState.Checked) { MessageBox.Show($"选中: {checkedListBox1.Items[e.Index]}"); } }
-
SelectedIndexChanged
选中项变化时触发(注意:此事件与复选框勾选无关,仅响应高亮项变化)。
四、高级应用场景
1. 全选/反选功能
private void btnSelectAll_Click(object sender, EventArgs e) {
bool isChecked = !checkedListBox1.CheckedItems.Cast<object>().Any(); // 根据当前状态反转
for (int i = 0; i < checkedListBox1.Items.Count; i++) {
checkedListBox1.SetItemChecked(i, isChecked);
}
}
2. 动态范围选择
private void SelectRange(int start, int end) {
for (int i = start; i <= end; i++) {
if (i < checkedListBox1.Items.Count) {
checkedListBox1.SetItemChecked(i, true);
}
}
}
3. 数据库交互示例
// 绑定数据库数据
private void LoadData() {
DataTable dt = GetDataFromDatabase(); // 假设方法
checkedListBox1.DataSource = dt;
checkedListBox1.DisplayMember = "ProductName";
checkedListBox1.ValueMember = "ProductID";
}
// 获取选中项的值
private void GetSelectedValues() {
foreach (DataRowView row in checkedListBox1.CheckedItems) {
int productId = Convert.ToInt32(row["ProductID"]);
Console.WriteLine($"选中ID: {productId}");
}
}
五、注意事项
-
性能优化
大数据量时避免频繁操作Items
集合,优先使用数据绑定。 -
事件冲突
CheckOnClick=true
时,右键菜单需绑定ContextMenuStrip
,否则右键会切换选中状态。 -
状态持久化
通过序列化(如JSON/XML)或数据库存储用户选择,实现跨会话状态恢复。
总结
CheckedListBox通过灵活的属性和事件机制,可满足从简单多选到复杂数据绑定的多样化需求。掌握其核心API(如SetItemChecked
、GetItemChecked
)和事件处理(如ItemCheck
),能够高效实现表单选择、批量操作等业务逻辑。结合数据库交互时,需注意数据绑定模式下的状态管理差异。