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

如何禁用DataGridView中的按钮?ReadOnly属性无效求助

解决DataGridView按钮单元格设置ReadOnly后仍可点击的问题

我懂你碰到的这个坑——DataGridViewButtonCell的ReadOnly属性根本管不了按钮的点击交互!这个属性只是用来控制单元格的值能不能被编辑修改,而按钮的点击属于独立的交互事件,和“编辑单元格值”完全是两码事,所以你之前的代码自然没效果。

下面给你两种靠谱的解决方案:

方法一:直接禁用按钮的交互状态

DataGridViewButtonCell本身没有直接的Enabled属性,但可以通过修改单元格样式的Enabled来禁用它,设置后按钮会变成灰色,完全不可点击:

foreach(DataGridViewRow row in grdWorkDayTime.Rows) {
    // 处理编辑按钮(列索引4)
    DataGridViewButtonCell editBtn = (DataGridViewButtonCell)row.Cells[4];
    editBtn.Style.Enabled = false;
    
    // 处理删除按钮(列索引5)
    DataGridViewButtonCell deleteBtn = (DataGridViewButtonCell)row.Cells[5];
    deleteBtn.Style.Enabled = false;
}

如果你的按钮是通过DataGridViewButtonColumn整列添加的,还可以直接禁用整列,不用遍历每一行,效率更高:

// 禁用编辑按钮列
((DataGridViewButtonColumn)grdWorkDayTime.Columns[4]).DefaultCellStyle.Enabled = false;
// 禁用删除按钮列
((DataGridViewButtonColumn)grdWorkDayTime.Columns[5]).DefaultCellStyle.Enabled = false;

方法二:在点击事件中拦截操作

如果不想改变按钮的外观,只是想阻止点击后的逻辑执行,可以在CellClick事件里做判断拦截。

首先给DataGridView绑定事件(可以在设计器里添加,也可以代码注册):

grdWorkDayTime.CellClick += grdWorkDayTime_CellClick;

然后实现事件处理逻辑,比如用一个全局变量isEditing标记是否要禁用按钮:

// 全局变量,标记是否处于编辑状态(此时要禁用所有按钮)
private bool isEditing = false;

private void grdWorkDayTime_CellClick(object sender, DataGridViewCellEventArgs e) {
    // 判断是否点击的是编辑或删除按钮列
    if (e.ColumnIndex == 4 || e.ColumnIndex == 5) {
        // 如果处于禁用状态,直接拦截事件
        if (isEditing) {
            e.Handled = true;
            return;
        }
        
        // 正常状态下执行对应的逻辑
        if (e.ColumnIndex == 4) {
            // 你的编辑操作逻辑
            // 执行完后设置isEditing = true,禁用所有按钮
            isEditing = true;
        } else {
            // 你的删除操作逻辑
        }
    }
}

这样当用户点击编辑按钮后,设置isEditing = true,后续再点击任何按钮都会被拦截,不会触发逻辑。

内容的提问来源于stack exchange,提问作者mohamd J.A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:59:24