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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:12:03