2008-12-18 81 views
1

我有一个带有复选框的TemplateField的GridView。我的目标是使用autopostback捕获onclick事件并设置数据库标志。我唯一的问题是事件发生了两次。第一次复选框(在发件人参数中)保存点击值,因此我根据点击进行设置。发件人参数第二次有复选框,始终checked = false。我很乐意接受其他解决此问题的建议,但我的目标是根据用户选中复选框来设置数据库标志。我的目标是.NET Framework 2.0。单击复选框会导致onCheckedChanged触发两次

下面是相关的代码:

<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 ... 
    } 
} 
+0

您可能需要张贴更多代码才能得到回复 – 2008-12-18 22:43:11

+0

这可能是不相关的,但如果标签没有指定src,那么浏览器中存在一个错误。那么两个请求都是 – 2008-12-18 22:48:19

回答

0

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

1

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

0

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

在“InitializeComponent”里面的代码中检查你的代码。这将导致该事件被注册两次,因此触发两次。

您需要在一个地方将其删除以解决问题。

rAm。

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

另一个潜在的问题是数据绑定发生的地方 - 我在代码中没有看到DataSource,所以我想你是在代码隐藏的数据绑定。

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