1

我有一个带有复选框的 TemplateField 的 GridView。我的目标是使用自动回发捕获 onclick 事件并设置数据库标志。我唯一的问题是事件发生了两次。第一次 Checkbox (在 sender 参数中)保存点击的值,所以我根据点击设置它。第二次 sender 参数有一个始终选中=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 ...
    }
}
4

5 回答 5

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

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

于 2009-01-27T09:41:46.077 回答
1

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

于 2008-12-19T00:26:02.317 回答
0

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

于 2008-12-18T22:55:51.797 回答
0

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

在“InitializeComponent”内部的代码中检查您的代码。这将导致事件被注册两次,因此触发两次。

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

内存。

于 2008-12-19T12:29:02.477 回答
0

另一个潜在的问题是你的数据绑定发生在哪里——我在你的代码中没有看到数据源,所以我猜你是在代码隐藏中进行数据绑定。

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

于 2009-01-27T10:24:03.357 回答