2009-08-28 61 views
1

我创建了一列复选框的GridView。我希望用户选择复选框,单击注册按钮(在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

很难知道肯定没有看到更多的代码,但它听起来像你的页面重新结合上回发GridView(如您的regButton_Click事件)。因此,每次页面加载时都会重建GridView - 即使在用户单击注册按钮后也是如此。

if (!this.IsPostback) { 
    SQLQueryClassListings.DataBind(); 
} 

(这假设您对页面启用(或至少ViewState

如果是这样的话,你可以通过改变你使用绑定您的GridView这样的代码解决这个问题您还可以使用其他机制将客户端的状态(例如复选框选择)传送到服务器,但ViewState(对于其所有错误)是ASP.NET中用于doign的默认工具。)

结果是GridView中显示的数据将不会被compl etely最新,但如果你可以容忍,这是一个简单的方法来完成你想要的。

+0

我的英雄!它现在完美。我再也不会犯这个错误了。 – VengefulSakhmet 2009-08-28 16:43:15

+0

我的荣幸。 :)但这不完全是一个错误!在某些情况下,您希望在每次回发时重新绑定(例如,当您绝对需要最新的数据时)。但在这些情况下,您需要使用另一种将用户选择传递给服务器的方法(例如,将ID保存在由ViewState支持的页面上的属性中,或在表单上使用隐藏的输入控件)。 – 2009-08-28 17:52:28

1

您需要获取GridView控件的ItemDataBound事件,通过ID查找CheckBox,然后执行所需操作。

+0

..你可以做任何你喜欢的事! – 2009-08-28 15:58:10

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