我有一个带有带有复选框的 TemplateField 的 GridView 。我的目标是使用自动回发并设置数据库标志来捕获 onclick 事件。我唯一的问题是事件发生了两次。第一次复选框(在发送者参数中)保存单击的值,因此我根据单击设置它。第二次sender参数有一个复选框,总是checked=false。我很高兴接受有关解决此问题的其他方法的建议,但我的目标是根据用户选中复选框来设置数据库标志。我的目标是 .NET Framework 2.0。
以下是相关代码:
<div style="margin-left : 1em;margin-right:1em;">
<asp:GridView ID="RouteGridView" runat="server" AllowPaging="True"
AutoGenerateColumns="False" CellPadding="4" DataKeyNames="ROUTE_NUMBER"
ForeColor="#333333" GridLines="None" style="width:100%;"
onselectedindexchanged="RouteGridView_SelectedIndexChanged"
AllowSorting="True" onpageindexchanging="RouteGridView_PageIndexChanging"
onsorting="RouteGridView_Sorting" >
<Columns>
<%-- Column one --%>
<asp:TemplateField HeaderText="Route" SortExpression="ROUTE_NUMBER">
<ItemTemplate>
<asp:LinkButton ID="HyperLink1" runat="server" CommandName="Select" CommandArgument='<%#Eval("ROUTE_NUMBER")%>'
Text='<%# Eval("ROUTE_NUMBER") %>' ></asp:LinkButton>
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
<%-- Column 2 this is where the problem CheckBox is--%>
<asp:TemplateField HeaderText="Read?"
SortExpression="READ_FLAG">
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server"
OnCheckedChanged="ChangeReadFlag"
AutoPostBack="true"
Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container) %>' />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>
<%-- more columns --%
<%-- more columns --%>
</Columns>
</asp:GridView>
这是背后代码中的事件处理程序:
protected void ChangeReadFlag(object sender, EventArgs e)
{
if (RouteGridView.SelectedIndex != -1)
{
CheckBox cb = ((CheckBox)sender);
DataKey key = RouteGridView.SelectedDataKey;
//... do stuff here ...
}
}
您是否在页面加载事件中将复选框的选中状态设置为 false ?
造成这种行为的原因可能有多种。就我而言,该事件被注册了两次:
作为复选框定义的一部分自动一次
<asp:CheckBox ID="CheckBox1" runat="server"
OnCheckedChanged="ChangeReadFlag"
AutoPostBack="true"
Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>'
Enabled='<%# isSelectedRow(Container) %>' />
第二次 - 在代码中的某处显式注册,通常在 OnInit 方法中:
CheckBox1.CheckedChanged += new EventHandler(ChangeReadFlag);
为了修复它,您应该从后面的代码或您的控件中删除第二个注册。
您想要捕获 GridView 的偶数;识别导致回发的命令(发送者),然后您可以执行数据库更新。
问题出现的原因之一(可能还有其他)是事件被注册了两次。
检查“InitializeComponent”后面代码中的代码。这将导致事件被注册两次,从而触发两次。
您需要在一处将其删除才能解决问题。
rAm.
另一个潜在的问题是数据绑定发生的地方 - 我在前面的代码中没有看到数据源,所以我猜你是在后面的代码中进行数据绑定。
如果您在回发时执行数据绑定,并且在第一个 onChange 事件触发后,数据绑定事件很可能会重置复选框的状态,从而导致该事件再次触发。