WinForm之CheckedListBox

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}");
    }
}

五、注意事项

  1. 性能优化
    大数据量时避免频繁操作Items集合,优先使用数据绑定。

  2. 事件冲突
    CheckOnClick=true时,右键菜单需绑定ContextMenuStrip,否则右键会切换选中状态。

  3. 状态持久化
    通过序列化(如JSON/XML)或数据库存储用户选择,实现跨会话状态恢复。


总结

CheckedListBox通过灵活的属性和事件机制,可满足从简单多选到复杂数据绑定的多样化需求。掌握其核心API(如SetItemCheckedGetItemChecked)和事件处理(如ItemCheck),能够高效实现表单选择、批量操作等业务逻辑。结合数据库交互时,需注意数据绑定模式下的状态管理差异。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值