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

ASP.NET 2.0中GridView内CheckBox勾选时阻止整页刷新

问题场景

现有ASP.NET 2.0的GridView代码如下:

<asp:GridView ID="GdDetails" runat="server" 
     AutoGenerateColumns="False" CellPadding="4" 
     Font-Names="Trebuchet MS" Font-Size="10pt" 
     Height="72px" Width="440px" 
     ForeColor="#333333" GridLines="None">
    <FooterStyle BackColor="#5D7B9D" ForeColor="White" Font-Bold="True" />
    <Columns>
        <asp:BoundField DataField="PMPDT" HeaderText="Date" />
        <asp:BoundField DataField="PMBRN" HeaderText="Branch" />
        <asp:BoundField DataField="PMPOL" HeaderText="Policy Number" />
        <asp:BoundField DataField="PMSEQ" HeaderText="DebitNote Number" />
        <asp:BoundField DataField="PMDEP" HeaderText="Department" />
        <asp:BoundField DataField="PMTOT" HeaderText="Total in Rs.">
            <ItemStyle HorizontalAlign="Right" />
        </asp:BoundField>
        <asp:BoundField DataField="PMBAL" HeaderText="Balance in Rs.">
            <ItemStyle HorizontalAlign="Right" />
        </asp:BoundField>
        <asp:BoundField DataField="RECNAME" HeaderText="Name"> </asp:BoundField>
        <asp:BoundField DataField="PMVE2" HeaderText="vehicleNo"  />
        <asp:TemplateField HeaderText="Settlement Amount" ItemStyle-Width="150">
            <ItemTemplate>
                <asp:TextBox ID="txtAmount" runat="server" AutoPostBack="true"  />
            </ItemTemplate>
        </asp:TemplateField> 

        <asp:TemplateField HeaderText="">  
            <ItemTemplate>
                <asp:CheckBox ID="chkcsec" runat="server" OnCheckedChanged="GetSelectedRecord" AutoPostBack="true"  />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
    <EditRowStyle BackColor="#999999" />
    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
</asp:GridView>

尝试使用UpdatePanel时出现「未知命令」错误;若将CheckBox的AutoPostBack设为false,又无法触发GetSelectedRecord函数。需要实现:勾选CheckBox时停止页面整页刷新,同时保留原有功能。


解决方案

1. 核心配置:ScriptManager + UpdatePanel

ASP.NET 2.0中实现AJAX局部刷新必须先添加ScriptManager控件,再用UpdatePanel包裹GridView,同时正确配置触发器捕获动态控件的事件。

2. 完整页面代码示例

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="YourPage.aspx.cs" Inherits="YourPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <%-- 必须添加ScriptManager,ASP.NET AJAX的基础控件 --%>
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        
        <%-- 用UpdatePanel包裹GridView,实现局部刷新 --%>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:GridView ID="GdDetails" runat="server" 
                     AutoGenerateColumns="False" CellPadding="4" 
                     Font-Names="Trebuchet MS" Font-Size="10pt" 
                     Height="72px" Width="440px" 
                     ForeColor="#333333" GridLines="None">
                    <FooterStyle BackColor="#5D7B9D" ForeColor="White" Font-Bold="True" />
                    <Columns>
                        <asp:BoundField DataField="PMPDT" HeaderText="Date" />
                        <asp:BoundField DataField="PMBRN" HeaderText="Branch" />
                        <asp:BoundField DataField="PMPOL" HeaderText="Policy Number" />
                        <asp:BoundField DataField="PMSEQ" HeaderText="DebitNote Number" />
                        <asp:BoundField DataField="PMDEP" HeaderText="Department" />
                        <asp:BoundField DataField="PMTOT" HeaderText="Total in Rs.">
                            <ItemStyle HorizontalAlign="Right" />
                        </asp:BoundField>
                        <asp:BoundField DataField="PMBAL" HeaderText="Balance in Rs.">
                            <ItemStyle HorizontalAlign="Right" />
                        </asp:BoundField>
                        <asp:BoundField DataField="RECNAME" HeaderText="Name"> </asp:BoundField>
                        <asp:BoundField DataField="PMVE2" HeaderText="vehicleNo"  />
                        <asp:TemplateField HeaderText="Settlement Amount" ItemStyle-Width="150">
                            <ItemTemplate>
                                <asp:TextBox ID="txtAmount" runat="server" AutoPostBack="true"  />
                            </ItemTemplate>
                        </asp:TemplateField> 

                        <asp:TemplateField HeaderText="">  
                            <ItemTemplate>
                                <%-- 保留AutoPostBack=true,确保触发GetSelectedRecord --%>
                                <asp:CheckBox ID="chkcsec" runat="server" OnCheckedChanged="GetSelectedRecord" AutoPostBack="true" />
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                    <RowStyle BackColor="#F7F6F3" ForeColor="#333333" />
                    <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
                    <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" />
                    <HeaderStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
                    <EditRowStyle BackColor="#999999" />
                    <AlternatingRowStyle BackColor="White" ForeColor="#284775" />
                </asp:GridView>
            </ContentTemplate>
            <%-- 配置触发器,捕获GridView的回发事件 --%>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="GdDetails" EventName="RowCommand" />
                <asp:AsyncPostBackTrigger ControlID="GdDetails" EventName="CheckedChanged" />
            </Triggers>
        </asp:UpdatePanel>
    </form>
</body>
</html>

3. 后台代码修正

确保GetSelectedRecord能正确获取行数据

protected void GetSelectedRecord(object sender, EventArgs e)
{
    // 获取触发事件的CheckBox
    CheckBox chk = (CheckBox)sender;
    // 获取当前所在的GridView行
    GridViewRow row = (GridViewRow)chk.NamingContainer;
    
    // 示例:获取当前行的Policy Number
    string policyNumber = row.Cells[2].Text;
    // 执行你的业务逻辑(比如填充数据、更新状态等)
}

避免重复绑定数据导致视图状态问题

protected void Page_Load(object sender, EventArgs e)
{
    // 仅在首次加载时绑定数据,回发时不重复绑定
    if (!IsPostBack)
    {
        BindGridView();
    }
}

// 自定义数据绑定方法
private void BindGridView()
{
    // 这里写你的数据绑定逻辑,比如从数据库获取数据绑定到GdDetails
    // GdDetails.DataSource = 你的数据源;
    // GdDetails.DataBind();
}

4. 「未知命令」错误排查要点

  • 必须添加ScriptManager:没有这个控件,UpdatePanel无法工作。
  • Web.config配置:ASP.NET 2.0需要在Web.config中添加AJAX相关配置节,确保以下内容存在:
<system.web>
    <httpHandlers>
        <remove verb="*" path="*.asmx"/>
        <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
    </httpHandlers>
    <compilation debug="true">
        <assemblies>
            <add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </assemblies>
    </compilation>
</system.web>
  • UpdatePanel的UpdateMode:建议设为Conditional,配合代码中调用UpdatePanel1.Update()手动触发局部刷新,减少不必要的更新。

内容的提问来源于stack exchange,提问作者dilini dissanayaka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:37:38