如何基于条件启用/禁用DataGrid(非DataGridView)中DatagridBoolColumn复选框?
解决DataGrid中按条件启用/禁用复选框列的问题
WinForms的DataGrid没有DataGridView那样直接的单元格启用属性,得通过自定义列样式或者事件拦截来实现需求,以下是两种可行方案:
方案一:自定义DataGridBoolColumn,封装判断逻辑
把条件判断逻辑封装在列本身里,复用性更强:
- 自定义继承自
DataGridBoolColumn的类,重写Edit方法拦截编辑操作:
public class ConditionalBoolColumn : DataGridBoolColumn { protected override void Edit(CurrencyManager source, int rowNum, Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible) { // 获取当前行数据(以DataTable数据源为例,可根据实际绑定对象调整) DataRowView rowView = (DataRowView)source.List[rowNum]; string aColumnValue = rowView["A"].ToString(); // 自定义判断条件:比如A列值为"禁用"时不允许编辑 bool canEdit = !aColumnValue.Equals("禁用", StringComparison.OrdinalIgnoreCase); if (canEdit) { base.Edit(source, rowNum, bounds, readOnly, instantText, cellIsVisible); } else { // 直接结束编辑状态,阻止复选框修改 this.DataGridTableStyle.DataGrid.EndEdit(); } } }
- 替换原有列并绑定到DataGrid:
// 清空原有列样式 dataGrid1.TableStyles.Clear(); DataGridTableStyle tableStyle = new DataGridTableStyle(); tableStyle.MappingName = ((DataTable)dataGrid1.DataSource).TableName; // 添加A列 DataGridTextBoxColumn aColumn = new DataGridTextBoxColumn(); aColumn.MappingName = "A"; aColumn.HeaderText = "A列"; tableStyle.GridColumnStyles.Add(aColumn); // 添加自定义的B列 ConditionalBoolColumn bColumn = new ConditionalBoolColumn(); bColumn.MappingName = "B"; bColumn.HeaderText = "B列"; tableStyle.GridColumnStyles.Add(bColumn); dataGrid1.TableStyles.Add(tableStyle);
方案二:通过DataGrid的BeginEdit事件拦截编辑
不想自定义列的话,直接监听BeginEdit事件判断条件:
private void dataGrid1_BeginEdit(object sender, System.ComponentModel.CancelEventArgs e) { DataGrid grid = (DataGrid)sender; // 确认当前编辑的是B列 if (grid.CurrentCell.ColumnNumber == grid.TableStyles[0].GridColumnStyles["B"].Index) { // 获取当前行数据 DataRowView rowView = (DataRowView)grid.BindingContext[grid.DataSource, grid.DataMember].Current; string aValue = rowView["A"].ToString(); // 自定义条件:比如A列值为"不可选"时取消编辑 if (aValue.Equals("不可选", StringComparison.OrdinalIgnoreCase)) { e.Cancel = true; // 取消编辑,复选框无法被修改 } } }
注意事项
- 如果数据源是自定义实体类,把
DataRowView替换为对应的实体对象即可 - 条件判断逻辑可根据实际需求调整,比如字符串匹配、数值范围校验等
内容的提问来源于stack exchange,提问作者Nidhin Paul
相关产品推荐
相关产品推荐

