C# 单击复选框会导致 onCheckedChanged 触发两次
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/379571/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Clicking checkbox causes onCheckedChanged to fire twice
提问by minty
I have a GridView with a TemplateField with a checkbox. My goal is to capture the onclick event using autopostback and setting a database flag. My only problem is that the event fire's twice. The first time The Checkbox (In the sender parameter) holds the clicked value so I set it based on the click. The second time the sender parameter has a checkbox that is always checked=false. I am happy to entertain suggestions on other approached to solving this problem but my goal is to set a database flag based on the user checking a checkbox. I am targeting .NET Framework 2.0.
我有一个带有复选框的 TemplateField 的 GridView。我的目标是使用自动回发和设置数据库标志来捕获 onclick 事件。我唯一的问题是事件触发了两次。第一次复选框(在发送者参数中)保存点击的值,所以我根据点击设置它。第二次发件人参数有一个复选框,总是被选中=假。我很高兴接受有关解决此问题的其他方法的建议,但我的目标是根据用户选中复选框来设置数据库标志。我的目标是 .NET Framework 2.0。
Here is the associated code:
这是相关的代码:
<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>
Here is the event handler from the code behind:
这是来自背后代码的事件处理程序:
protected void ChangeReadFlag(object sender, EventArgs e)
{
if (RouteGridView.SelectedIndex != -1)
{
CheckBox cb = ((CheckBox)sender);
DataKey key = RouteGridView.SelectedDataKey;
//... do stuff here ...
}
}
回答by Victor
You want to capture the even of the GridView; identify the command (sender) that is causing the postback, and then you can execute your DB update.
您想捕获 GridView 的偶数;确定导致回发的命令(发件人),然后您可以执行您的数据库更新。
回答by Chris Conway
Do you set the checked status of the checkbox to false at all in your page load event?
您是否在页面加载事件中将复选框的选中状态设置为 false?
回答by rAm
One of the reasons(there may be others) the problem comes is the event is registered twice.
问题出现的原因之一(可能还有其他原因)是事件被注册了两次。
Check your Code in the code behind, inside "InitializeComponent". This will cause the event to be registered twice and hence fire twice.
在“InitializeComponent”内的后面代码中检查您的代码。这将导致事件被注册两次并因此触发两次。
You need to remove it at one place to solve the issue.
您需要在一个地方将其删除以解决问题。
rAm.
内存。
回答by Lekim
There could be several reasons for such behavior. In my case it was that the event was being registered twice:
one time automatically as a part of the checkbox definition<asp:CheckBox ID="CheckBox1" runat="server"
**OnCheckedChanged="ChangeReadFlag"**
AutoPostBack="true"
Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container) %>' />
这种行为可能有多种原因。在我的情况下,事件被注册两次:一次自动作为复选框定义的一部分<asp:CheckBox ID="CheckBox1" runat="server"
**OnCheckedChanged="ChangeReadFlag"**
AutoPostBack="true"
Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container) %>' />
and the second time - an explicit registration somewhere in code, usually in OnInit method:CheckBox1.CheckedChanged += new EventHandler(ChangeReadFlag);
第二次 - 在代码中的某处显式注册,通常在 OnInit 方法中:CheckBox1.CheckedChanged += new EventHandler(ChangeReadFlag);
In order to fix it, you should remove the second registration either from the code behind or from your control.
为了修复它,您应该从后面的代码或您的控件中删除第二个注册。
回答by Zhaph - Ben Duguid
Another potential problem is where your databinding is happening - I don't see a DataSource in your code-in-front, so I guess you're databinding in the code-behind.
另一个潜在问题是您的数据绑定发生的位置 - 我在您的前端代码中没有看到 DataSource,所以我猜您在代码隐藏中进行了数据绑定。
If you are doing the databind on postback, and after the first onChange event has fired, it's quite likely that the databind event is reseting the checkbox's status, and so causing the event to fire again.
如果您在回发时执行数据绑定,并且在第一个 onChange 事件触发后,数据绑定事件很可能正在重置复选框的状态,从而导致事件再次触发。