ASP.NET GridView禁用行时如何保持首列CheckBox可用?
解决GridView点击复选框后禁用整行但保留复选框可用的问题
问题描述
我有一个首列包含CheckBox的GridView,当点击复选框时,希望禁用该行,但保持该CheckBox可用。但以下代码会将整行(包括CheckBox)一并禁用:
protected void chkRow_CheckedChanged(object sender, EventArgs e) { CheckBox chkRow = (CheckBox)sender; GridViewRow row = (GridViewRow)chkRow.NamingContainer; if (chkRow.Checked) { // 禁用行 row.Enabled = false; row.Style["background-color"] = "#F5F5F5"; chkRow.Enabled = true; } else { // .... } }
解决方案
直接设置row.Enabled = false会递归禁用该行内所有控件,包括目标复选框。正确做法是遍历行内控件,单独禁用除触发事件的CheckBox外的其他控件,而非直接禁用整行。
修改后的代码如下:
protected void chkRow_CheckedChanged(object sender, EventArgs e) { CheckBox chkRow = (CheckBox)sender; GridViewRow row = (GridViewRow)chkRow.NamingContainer; if (chkRow.Checked) { // 设置行背景色 row.Style["background-color"] = "#F5F5F5"; // 遍历行内单元格及控件,禁用除当前复选框外的其他控件 foreach (Control cell in row.Controls) { foreach (Control ctrl in cell.Controls) { if (ctrl != chkRow && ctrl is WebControl webCtrl) { webCtrl.Enabled = false; } } } } else { // 恢复行背景色 row.Style.Remove("background-color"); // 遍历行内控件,恢复启用状态 foreach (Control cell in row.Controls) { foreach (Control ctrl in cell.Controls) { if (ctrl is WebControl webCtrl) { webCtrl.Enabled = true; } } } } }
说明
- 避免直接禁用整行,改为逐个处理单元格内的控件,跳过触发事件的CheckBox。
- 针对
WebControl类型控件设置启用状态,覆盖GridView内常见的输入控件、按钮等。 - 取消选中时同步恢复控件启用状态和行背景样式。
内容的提问来源于stack exchange,提问作者user1663661
相关产品推荐
相关产品推荐

