检查/取消选中不在gridview中处理的分页中工作

时间:2011-03-30 06:08:12

标签: c# asp.net gridview

我在gridview中使用过分页 我需要在服务器端或客户端的gridview中检查/取消选中的代码 我试过没有分页,它正在工作。我需要分页。

<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox ID="chkHGrid" runat="server" />
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="chkGrid" runat="server" />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" />
<HeaderStyle HorizontalAlign="Center" />
</asp:TemplateField>

1 个答案:

答案 0 :(得分:4)

这种技术称为在Paging中维护GridView CheckBox的状态。实现此目的的一种方法如下。

  1. 创建一个int或string的Genric列表,以存储与Checked行相关的DataKeys。
  2. 在将PageIndex设置为新索引之前,在PageIndexChanging处。对于GridView中的每一行,
    • 如果选中复选框,请将ID存储到通用列表。
    • 如果未选中复选框&amp;该ID存在于通用列表中,将其从列表中删除。
  3. 在RowDataBound事件中,对于每个DataRow,检查Generic List中是否存在DataKeyName。如果是这样,找到CheckBox并进行检查。
  4. 使用Products Table,Northwind Database的一个简单示例如下所示

    标记

    <asp:GridView ID="gvProducts" runat="server"
                AllowPaging="True"
                AutoGenerateColumns="False"
                DataKeyNames="ProductID"
                OnPageIndexChanging="gvProducts_PageIndexChanging"
                OnRowDataBound="gvProducts_RowDataBound">
        <Columns>
            <asp:TemplateField HeaderText="Select">
                <ItemTemplate>
                    <asp:CheckBox ID="chkSelect" runat="server" />
                </ItemTemplate>
            </asp:TemplateField>
        <asp:BoundField DataField="ProductID" HeaderText="ProductID" InsertVisible="False"
        ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" />
        </Columns>
    </asp:GridView>
    <asp:SqlDataSource ID="sdsProducts" runat="server"
                    ConnectionString='<%$ ConnectionStrings:NorthwindConnectionString %>'
                    SelectCommand="SELECT * FROM Products">
    </asp:SqlDataSource>
    

    背后的守则

    private List<int> ProductIDs
    {
        get
        {
            if (this.ViewState["ProductIDs"] == null)
            {
                this.ViewState["ProductIDs"] = new List<int>();
            }
            return this.ViewState["ProductIDs"] as List<int>;
        }
    }
    
    protected void gvProducts_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        foreach (GridViewRow gvr in gvProducts.Rows)
        {
            CheckBox chkSelect = gvr.FindControl("chkSelect") as CheckBox;
            if (chkSelect != null)
            {
                int productID = Convert.ToInt32(gvProducts.DataKeys[gvr.RowIndex]["ProductID"]);
                if (chkSelect.Checked && !this.ProductIDs.Contains(productID))
                {
                    this.ProductIDs.Add(productID);
                }
                else if (!chkSelect.Checked && this.ProductIDs.Contains(productID))
                {
                    this.ProductIDs.Remove(productID);
                }
            }
        }
    }
    
    protected void gvProducts_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        GridViewRow gvr = e.Row;
        if (gvr.RowType == DataControlRowType.DataRow)
        {
            CheckBox chkSelect = gvr.FindControl("chkSelect") as CheckBox;
            if (chkSelect != null)
            {
                int productID = Convert.ToInt32(gvProducts.DataKeys[gvr.RowIndex]["ProductID"]);
                chkSelect.Checked = this.ProductIDs.Contains(productID);
            }
        }
    }