asp.net 单击复选框将导致onAnswedChanged触发两次

e4yzc0pl  于 2024-01-09  发布在  .NET
关注(0)|答案(5)|浏览(167)

我有一个GridView,它有一个带复选框的TemplateField。我的目标是使用自动回发和设置数据库标志来捕获onclick事件。我唯一的问题是事件触发了两次。第一次是复选框(在sender参数中)保存点击的值,所以我根据点击来设置它。第二次sender参数有一个总是选中的复选框= false.我很乐意接受其他解决此问题的方法的建议,但我的目标是根据用户选中复选框设置数据库标志。我的目标是.NET Framework 2.0。
下面是相关代码:

  1. <div style="margin-left : 1em;margin-right:1em;">
  2. <asp:GridView ID="RouteGridView" runat="server" AllowPaging="True"
  3. AutoGenerateColumns="False" CellPadding="4" DataKeyNames="ROUTE_NUMBER"
  4. ForeColor="#333333" GridLines="None" style="width:100%;"
  5. onselectedindexchanged="RouteGridView_SelectedIndexChanged"
  6. AllowSorting="True" onpageindexchanging="RouteGridView_PageIndexChanging"
  7. onsorting="RouteGridView_Sorting" >
  8. <Columns>
  9. <%-- Column one --%>
  10. <asp:TemplateField HeaderText="Route" SortExpression="ROUTE_NUMBER">
  11. <ItemTemplate>
  12. <asp:LinkButton ID="HyperLink1" runat="server" CommandName="Select" CommandArgument='<%#Eval("ROUTE_NUMBER")%>'
  13. Text='<%# Eval("ROUTE_NUMBER") %>' ></asp:LinkButton>
  14. </ItemTemplate>
  15. <ItemStyle HorizontalAlign="Center" />
  16. </asp:TemplateField>
  17. <%-- Column 2 this is where the problem CheckBox is--%>
  18. <asp:TemplateField HeaderText="Read?"
  19. SortExpression="READ_FLAG">
  20. <ItemTemplate>
  21. <asp:CheckBox ID="CheckBox1" runat="server"
  22. OnCheckedChanged="ChangeReadFlag"
  23. AutoPostBack="true"
  24. Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container) %>' />
  25. </ItemTemplate>
  26. <ItemStyle HorizontalAlign="Center" />
  27. </asp:TemplateField>
  28. <%-- more columns --%
  29. <%-- more columns --%>
  30. </Columns>
  31. </asp:GridView>

字符串
下面是事件处理程序的代码:

  1. protected void ChangeReadFlag(object sender, EventArgs e)
  2. {
  3. if (RouteGridView.SelectedIndex != -1)
  4. {
  5. CheckBox cb = ((CheckBox)sender);
  6. DataKey key = RouteGridView.SelectedDataKey;
  7. //... do stuff here ...
  8. }
  9. }

nwlls2ji

nwlls2ji1#

在页面加载事件中,您是否将复选框的选中状态设置为false?

jv2fixgn

jv2fixgn2#

这种行为可能有几个原因,在我的例子中,事件被注册了两次:一次是作为复选框定义的一部分自动注册的

  1. <asp:CheckBox ID="CheckBox1" runat="server"
  2. OnCheckedChanged="ChangeReadFlag"
  3. AutoPostBack="true"
  4. Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>'
  5. Enabled='<%# isSelectedRow(Container) %>' />

字符串
第二次-在代码中的某个地方显式注册,通常在OnInit方法中:
第一个月
为了修复它,您应该从代码后面或控件中删除第二个注册。

ymdaylpp

ymdaylpp3#

您希望捕获GridView的事件;确定导致回发的命令(发送者),然后就可以执行DB更新。

gdx19jrr

gdx19jrr4#

问题出现的原因之一(可能还有其他原因)是事件注册了两次。
请在“InitializeComponent”内的代码后面检查代码。这将导致事件注册两次,从而引发两次。
您需要在一个位置将其删除才能解决此问题。
RAM.

vlurs2pr

vlurs2pr5#

另一个潜在的问题是您的数据绑定发生在哪里-我在您的代码中没有看到DataSource,所以我猜您正在代码后面进行数据绑定。
如果您在回发时执行数据绑定,并且在第一个onChange事件触发之后,则很可能数据绑定事件正在重置复选框的状态,从而导致事件再次触发。

相关问题