You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将CheckedListBox控件与自定义类的属性进行绑定?

实现方案

1. 先优化DataGridView的绑定逻辑

你当前手动循环加行的方式可以实现效果,但后续要动态控制列显示隐藏时,直接绑定数据源的方案可维护性更高:

// 假设存储属性的自定义类名为FileItem,ds为List<FileItem>类型的数据集
// 直接绑定数据源,控件会自动根据类属性生成对应列,列的默认名称和属性名一致
fileListDataGridView.DataSource = ds;

如果你不想修改原有手动加行的逻辑,可以自行维护一个列索引和属性的映射数组:var propMap = new string[] {"Path", "PatientName", "PatientID"},后续控制列显示时直接按索引取值即可,缺点是调整属性顺序时需要同步修改映射关系,维护成本更高。

2. CheckedListBox和类属性绑定

不要只依赖索引做硬绑定,建议给CheckedListBox的选项同时存储「用户可见的显示文本」和「对应类属性名」,后续修改选项顺序也不会影响逻辑:

// 第二个筛选窗体的Load事件中初始化复选列表
// Key为显示给用户的选项文本,Value为自定义类对应的属性名
var propertyOptions = new List<KeyValuePair<string, string>>()
{
    new KeyValuePair<string, string>("文件路径", "Path"),
    new KeyValuePair<string, string>("患者姓名", "PatientName"),
    new KeyValuePair<string, string>("患者ID", "PatientID")
};
checkedListBox1.DataSource = propertyOptions;
checkedListBox1.DisplayMember = "Key";
checkedListBox1.ValueMember = "Value";
// 可按需设置初始勾选状态

3. 实现勾选状态和DataGridView列显示的联动

方案A:点击确认按钮后同步(适合筛选窗体为模态弹窗的场景)

在第二个筛选窗体中新增公开属性存储选中的属性列表,点击确认按钮后返回结果:

// 筛选窗体中定义公开属性
public List<string> SelectedProperties { get; private set; }

// 确认按钮点击事件
private void btnConfirm_Click(object sender, EventArgs e)
{
    SelectedProperties = new List<string>();
    foreach (var checkedItem in checkedListBox1.CheckedItems)
    {
        var item = (KeyValuePair<string, string>)checkedItem;
        SelectedProperties.Add(item.Value);
    }
    this.DialogResult = DialogResult.OK;
    this.Close();
}

在第一个窗体中接收结果,控制列显示:

// 第一个窗体打开筛选窗体的按钮逻辑
private void btnOpenFilter_Click(object sender, EventArgs e)
{
    using (FilterForm filterForm = new FilterForm())
    {
        if(filterForm.ShowDialog() == DialogResult.OK)
        {
            // 先隐藏所有列
            foreach (DataGridViewColumn col in fileListDataGridView.Columns)
            {
                col.Visible = false;
            }
            // 仅展示勾选的列
            foreach (var propName in filterForm.SelectedProperties)
            {
                if(fileListDataGridView.Columns.Contains(propName))
                {
                    fileListDataGridView.Columns[propName].Visible = true;
                }
            }
        }
    }
}

方案B:实时联动(勾选立刻生效的场景)

用事件实现低耦合的实时通知,筛选窗体中定义事件并在勾选变化时触发:

// 筛选窗体定义事件
public event Action<List<string>> OnSelectionChanged;

// CheckedListBox的ItemCheck事件
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    // 等待勾选状态更新完成后再获取选中列表
    BeginInvoke(new Action(() =>
    {
        List<string> selectedProps = new List<string>();
        foreach (var checkedItem in checkedListBox1.CheckedItems)
        {
            var item = (KeyValuePair<string, string>)checkedItem;
            selectedProps.Add(item.Value);
        }
        OnSelectionChanged?.Invoke(selectedProps);
    }));
}

第一个窗体订阅事件即可实时更新列显示:

private void btnOpenFilter_Click(object sender, EventArgs e)
{
    FilterForm filterForm = new FilterForm();
    filterForm.OnSelectionChanged += (selectedProps) =>
    {
        foreach (DataGridViewColumn col in fileListDataGridView.Columns)
        {
            col.Visible = false;
        }
        foreach (var propName in selectedProps)
        {
            if(fileListDataGridView.Columns.Contains(propName))
            {
                fileListDataGridView.Columns[propName].Visible = true;
            }
        }
    };
    filterForm.Show();
}

内容的提问来源于stack exchange,提问作者Sanktos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:27:05