GridView复选框列与事件

时间:2009-08-28 15:45:23

标签: asp.net gridview checkbox

我创建了一个带有一列复选框的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" />

3 个答案:

答案 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中显示的数据不会完全是最新的,但如果你能够容忍,那么这是一种完成你想要的简单方法。