单击复选框会导致 onCheckedChanged 触发两次

问题描述 投票:0回答:5

我有一个带有带有复选框的 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 ...
    }
}
c# asp.net events checkbox oncheckedchanged
5个回答
1
投票

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


1
投票

造成这种行为的原因可能有多种。就我而言,该事件被注册了两次: 作为复选框定义的一部分自动一次

<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);

为了修复它,您应该从后面的代码或您的控件中删除第二个注册。


0
投票

您想要捕获 GridView 的偶数;识别导致回发的命令(发送者),然后您可以执行数据库更新。


0
投票

问题出现的原因之一(可能还有其他)是事件被注册了两次。

检查“InitializeComponent”后面代码中的代码。这将导致事件被注册两次,从而触发两次。

您需要在一处将其删除才能解决问题。

rAm.


0
投票

另一个潜在的问题是数据绑定发生的地方 - 我在前面的代码中没有看到数据源,所以我猜你是在后面的代码中进行数据绑定。

如果您在回发时执行数据绑定,并且在第一个 onChange 事件触发后,数据绑定事件很可能会重置复选框的状态,从而导致该事件再次触发。

© www.soinside.com 2019 - 2024. All rights reserved.