我创建了一个带有一列复选框的gridview。我希望用户选中复选框,单击注册按钮(在gridview外部),并显示所选行的标题。根据我的阅读,我应该在按钮点击事件中选中复选框。我已经这样做了,但显然它进入该事件的唯一时间是在页面加载时,在页面加载之前,所有选中的复选框都被擦除。因此,我对所选复选框的检查永远不会出现。是否有一个事件可以更好地运行此检查,或者可能是通过页面加载保存这些值的方法?以下不是我的所有代码,只是受影响的部分。
protected void regButton_Click(Object sender, EventArgs e)
{
StringBuilder regClasses = new StringBuilder();
for (int i = 0; i < SQLQueryClassListings.Rows.Count; i++)
{
//Response.Write(SQLQueryClassListings.Rows[i].Cells[0].Text + " checkbox check ");
GridViewRow checkRow = SQLQueryClassListings.Rows[i];
bool reg = ((CheckBox)(checkRow.FindControl("RowCheckBox"))).Checked;
if (reg)
{
regClasses.Append(SQLQueryClassListings.Rows[i].Cells[0].Text + " ");
}
}
Response.Write(regClasses);
}
<asp:GridView ID="SQLQueryClassListings" AutoGenerateColumns="false" runat="server"
BorderWidth="1px" BackColor="White" CellPadding="5" BorderColor="Black" RowStyle-BorderColor = "Black"
HeaderStyle-BackColor="#0D69F2" HeaderStyle-ForeColor="White" AlternatingRowStyle-BackColor="#E8E8E8" HeaderStyle-BorderColor="Black" GridLines="Both">
<Columns>
<asp:BoundField HeaderText="Classes" DataField="LeafName" HeaderStyle-HorizontalAlign="Left" ItemStyle-Width="250"
ItemStyle-BorderColor="#ADADAD" HeaderStyle-BorderColor ="Black"/>
<asp:BoundField HeaderText="Teacher" DataField="TeacherName" HeaderStyle-HorizontalAlign="Left" ItemStyle-Width="200"
ItemStyle-BorderColor="#ADADAD" HeaderStyle-BorderColor ="Black"/>
<asp:BoundField HeaderText="Available" DataField="SemesterEnds" HeaderStyle-HorizontalAlign="Center"
ItemStyle-HorizontalAlign ="Center" ItemStyle-Width="150" ItemStyle-BorderColor="#ADADAD" HeaderStyle-BorderColor ="Black"/>
<asp:HyperLinkField HeaderText="Course Description & Career Tracks" DataNavigateUrlFields="ApplicableTracks"
Text="See Description" HeaderStyle-HorizontalAlign="Center" ItemStyle-HorizontalAlign ="Center" ItemStyle-BorderColor="#ADADAD" HeaderStyle-BorderColor ="Black"/>
<asp:TemplateField HeaderText="Register" HeaderStyle-BorderColor="Black" ItemStyle-BorderColor = "#ADADAD" ItemStyle-HorizontalAlign="Center">
<ItemTemplate>
<asp:CheckBox runat="server" ID="RowCheckBox"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<p>
<asp:Button ID="Button1" runat="server" Text="Register" OnClientClick="return confirm('You have sucessfully registered!')"
OnClick="regButton_Click" />
答案 0 :(得分:1)
您需要获取GridView控件的ItemDataBound事件,按ID查找CheckBox,并执行您需要的任何操作。
答案 1 :(得分:0)
您必须阅读GridView中的复选框。 因此,此代码将返回已检查行的ID。它会给你一个想法,然后你可以根据需要改变它。
protected string getCheckedIds(GridView gv)
{
StringBuilder sb = new StringBuilder();
foreach (GridViewRow gvr in gv.Rows)
{
if (!gvrIsChecked(gvr)) // see below for this method
continue;
if (sb.Length > 0)
sb.Append(",");
sb.Append(gv.DataKeys[gvr.DataItemIndex].Value);
}
return sb.ToString();
}
protected bool gvrIsChecked(GridViewRow gvr)
{
// The location of your checkbox may be different.
object cb = gvr.Cells[0].Controls[gvr.Cells[0].Controls.Count - 2];
if (cb.GetType() != typeof(CheckBox))
return false;
if (!((CheckBox)cb).Checked)
return false;
return true;
}
答案 2 :(得分:0)
如果没有看到更多代码,很难确定,但听起来您的网页正在重新绑定{@ 1}}回发(例如您的GridView
事件)。因此,每次加载页面时都会重建regButton_Click
- 即使在用户单击注册按钮之后也是如此。
如果是这种情况,您可以通过更改用于绑定GridView
的代码来解决此问题:
GridView
(这假设您为页面启用了if (!this.IsPostback) {
SQLQueryClassListings.DataBind();
}
(或者至少是ViewState
)。您可以使用其他机制将客户端的状态(例如复选框选择)传达给服务器,但GridView
(因为它的所有错误)是在ASP.NET中使用doign的默认工具。)
结果是ViewState
中显示的数据不会完全是最新的,但如果你能够容忍,那么这是一种完成你想要的简单方法。