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

如何基于条件启用/禁用DataGrid(非DataGridView)中DatagridBoolColumn复选框?

解决DataGrid中按条件启用/禁用复选框列的问题

WinForms的DataGrid没有DataGridView那样直接的单元格启用属性,得通过自定义列样式或者事件拦截来实现需求,以下是两种可行方案:

方案一:自定义DataGridBoolColumn,封装判断逻辑

把条件判断逻辑封装在列本身里,复用性更强:

  1. 自定义继承自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();
        }
    }
}
  1. 替换原有列并绑定到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:11:07