如何将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
相关产品推荐
相关产品推荐

