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

