我有一个带有复选框的TemplateField的GridView。我的目标是使用autopostback捕获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 ...
}
}
答案 0 :(得分:1)
您是否在页面加载事件中将复选框的选中状态设置为false?
答案 1 :(得分: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);
为了解决这个问题,您应该从后面的代码或控件中删除第二次注册。
答案 2 :(得分:0)
你想要捕获GridView的偶数;识别导致回发的命令(发送者),然后您可以执行数据库更新。
答案 3 :(得分:0)
问题出现的原因之一(可能还有其他原因)是事件被登记了两次。
在“InitializeComponent”内的代码中检查您的代码。这将导致事件被注册两次,因此发射两次。
您需要在一个地方将其删除才能解决问题。
RAM中。
答案 4 :(得分:0)
另一个潜在的问题是你的数据绑定发生的地方 - 我没有在你的代码中看到一个DataSource,所以我猜你是在代码隐藏中的数据绑定。
如果您在回发时执行数据绑定,并且在第一个onChange事件触发后,数据绑定事件很可能正在重置复选框的状态,从而导致事件再次触发。