【问题标题】:GridView Checkbox Columns vs. EventsGridView 复选框列与事件
【发布时间】:2010-11-23 18:53:42
【问题描述】:

我创建了一个带有一列复选框的网格视图。我希望用户选择复选框,单击注册按钮(在网格视图之外),并显示所选行的标题。从我读过的内容来看,我应该将复选框检查放在按钮单击事件中。我已经这样做了,但显然它进入该事件的唯一时间是在页面加载时和页面加载之前,所有选定的复选框都被擦除。因此,我对选定复选框的检查永远不会成立。是否有更适合运行此检查的事件,或者可能是通过页面加载来保存这些值的方法?以下不是我的所有代码,只是受影响的部分。

    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" />

【问题讨论】:

    标签: asp.net gridview checkbox


    【解决方案1】:

    如果不查看更多代码,很难确定,但听起来您的页面在回发时重新绑定了GridView(例如您的regButton_Click 事件)。因此,它会在每次页面加载时重建 GridView - 即使在您的用户单击注册按钮之后也是如此。

    如果是这种情况,您可以通过更改用于绑定 GridView 的代码来解决此问题,如下所示:

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

    (这假定您为页面启用了ViewState(或至少为GridView)。您可以使用其他机制将客户端的状态(例如复选框选择)传达给服务器,但是@ 987654328@(对于它的所有错误)是 ASP.NET 中 doign so 的默认工具。)

    结果是GridView 中显示的数据不会完全是最新的,但如果您可以容忍,这是实现您想要的简单方法。

    【讨论】:

    • 我的英雄!它现在完美运行。我再也不会犯这个错误了。
    • 我的荣幸。 :) 但这并不是一个错误!在某些情况下,您需要在每次回发时重新绑定(例如,当您绝对需要最新数据时)。但在这些情况下,您需要使用另一种方法将用户的选择传达给服务器(例如将 id 存储在由 ViewState 支持的页面上的属性中,或者在表单上使用隐藏的输入控件)。
    【解决方案2】:

    您必须从 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;
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • ..你可以为所欲为!
      猜你喜欢
      • 2018-09-26
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 2014-06-29
      相关资源
      最近更新 更多