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

无回发实现ASP.NET GridView行颜色随CheckBox选中切换

无回发实现GridView选中行背景色切换

问题描述

我有一个带CheckBox列的GridView控件,需求是:CheckBox选中时,对应行背景色改成蓝色;取消选中时恢复白色。之前用C#代码实现了功能,但需要回发,不符合无回发要求;尝试用JavaScript实现,但没法获取行相关信息。求客户端实现方式,或者无需回发的C#实现方式。

原C#代码

protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
    foreach (GridViewRow row in GridView1.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
            CheckBox chk = (CheckBox)row.FindControl("checkbox1");
            if (chk.Checked == true)
            {
                row.BackColor = System.Drawing.Color.FromArgb(220,220,255);
            }
            else
            {
                row.BackColor = System.Drawing.Color.White;
            }
        }
    }
}

原ASP.NET代码

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" ShowHeader="False">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate >
                <div style="position:absolute;height:60px;width:60px;">
                    <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="false"  onclick="functionName(this);"  />
                </div>
                <asp:Button ID="Button100" runat="server" Height="60px" Width="60px" BackColor="Transparent"/>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Id" ItemStyle-Width="5%" ItemStyle-Height="60px" ItemStyle-Wrap="false" />
        <asp:BoundField DataField="PatientName" ItemStyle-Width="15%" ItemStyle-Height="60px" ItemStyle-Wrap="false" />
        <asp:BoundField DataField="AccessionNumber" ItemStyle-Width="10%" ItemStyle-Height="60px" ItemStyle-Wrap="false" />
        <asp:BoundField DataField="SeriesDescription" ItemStyle-Width="10%" ItemStyle-Height="60px" ItemStyle-Wrap="false" />
        <asp:BoundField DataField="Status" ItemStyle-Width="8%" ItemStyle-Height="60px" ItemStyle-Wrap="false" />
        <asp:BoundField DataField="CreationDateTime" ItemStyle-Width="10%" ItemStyle-Height="60px" ItemStyle-Wrap="false" />
        <asp:BoundField DataField="PrintDateTime" ItemStyle-Width="10%" ItemStyle-Height="60px" ItemStyle-Wrap="false" />
        <asp:BoundField DataField="CallingAetitle" ItemStyle-Width="12%" ItemStyle-Height="60px" ItemStyle-Wrap="false" />
        <asp:BoundField DataField="CalledAetitle" ItemStyle-Width="12%" ItemStyle-Height="60px" ItemStyle-Wrap="false" />
        <asp:BoundField DataField="Pages" ItemStyle-Width="8%" ItemStyle-Height="60px" ItemStyle-Wrap="false" />
    </Columns>
    <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
    <SelectedRowStyle BackColor="#999999" Font-Bold="True" ForeColor="Black"/>
    <SortedAscendingCellStyle BackColor="#F1F1F1" />
    <SortedAscendingHeaderStyle BackColor="#0000A9" />
    <SortedDescendingCellStyle BackColor="#CAC9C9" />
    <SortedDescendingHeaderStyle BackColor="#000065" />
</asp:GridView>

<script type="text/javascript">
    function functionName(obj) {
        if (obj.checked) {
            alert('check box checked')
        } else {
            alert('check box not checked')
        }
    }
</script>

解决方案

客户端JavaScript实现(无回发)

你之前的JS没法获取行,是因为CheckBox嵌套在<div>里,只要通过DOM遍历找到对应的GridView行就行。替换原有脚本为以下代码:

function functionName(obj) {
    // 向上遍历找到CheckBox所在的GridView行
    let row = obj.closest('div').closest('tr');
    if (obj.checked) {
        // 和C#代码一致的蓝色背景
        row.style.backgroundColor = '#dcdcff';
    } else {
        // 恢复白色背景
        row.style.backgroundColor = '#ffffff';
    }
}

说明

  • closest()方法会向上查找最近的匹配元素,这里先找到包裹CheckBox的div,再找到对应的<tr>行
  • #dcdcff是你C#里Color.FromArgb(220,220,255)的十六进制颜色值,视觉效果完全一致
  • 不需要修改GridView的结构,直接替换脚本就能生效

关于无需回发的C#实现

ASP.NET WebForms的服务器控件默认依赖回发才能更新UI,没有原生的无回发C#实现方式。如果一定要用服务器端逻辑,只能结合UpdatePanel做局部回发,但本质还是有回发(只是页面不整页刷新),不符合你要的“无回发”要求,所以优先推荐纯JS方案。

内容的提问来源于stack exchange,提问作者Hugo Sa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 07:36:32