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
相关产品推荐
相关产品推荐

