从启用分页的 GridView 控件中检索所有 GridViewRow 对象

问题描述 投票:0回答:5

我当前的 aspx 页面上有一个启用分页的 GridView 控件,我需要循环遍历整个行集合/计数来处理所选记录。 使用我当前的代码,它只会循环遍历 GridView 行的当前页面。

完成这项任务的最佳方法是什么?

这是我当前的代码:

ASPX 页面:

<asp:GridView ID="MyGridView" runat="server" AllowPaging="true" PageSize="20">
   <Columns>
      <!-- My Column list -->
   </Columns>
</asp:GridView>
<asp:Button id="MyButton" runat="server" Text="Add" OnClick="MyButton_Click" />  

背后代码:

protected void MyButton_Click(object sender, EventArgs e)
{
    for (int Count = 0; Count < MyGridView.Rows.Count; Count++)
    {
        //The row count is 20 and only contains the GridViewRow object in the current page view  
        //I want to retrieve the all GridViews rows so I can add them to a ReorderList control
    }   
}
c# asp.net gridview pagination
5个回答
3
投票

是的,因为你的 gridview UI 只知道当前页面。 获取数据源并从那里确定行数...

        int count = ((DataTable)MyGridView.DataSource).Rows.Count;

//或

        int count = ((ICollection<SomeRecord>)MyGridView.DataSource).Count;

3
投票

只需使用以下代码:

//Change gridview to
GridView1.AllowPaging = false;
GridView1.DataBind();

 //Transfer rows from GridView to table
for (int i = 0; i < GridView1.Rows.Count; i++)
{
    if (GridView1.Rows[i].RowType == DataControlRowType.DataRow)
    {
        for (int j = 0; j < GridView1.Rows[0].Cells.Count; j++)
        {
              //Add your code here..
        }
    }
}

//After filling your datatable change gridview paging style back to first, ie.

GridView1.AllowPaging = true;
GridView1.DataBind();

这可能对您有帮助,请告诉我这是否对您有帮助......


1
投票

我认为您应该从数据源的行数中获取行数。

如果需要过滤行,可以使用DataTable/DataView的Select方法。

编辑: 如果 gridview 分页,则无法通过 gridview.Rows.Count 获取实际行数。根据您的评论,我假设您正在使用 listDataSource 通用列表来绑定 gridview,您可以将行数获取为:

List<DataSourceItem> selectedRows = 
  listDataSource.FindAll(delegate(DataSourceItem item)
  {
      // Assuming you have a IsSelected bool property 
      // that refers your row is selected : 
      return item.IsSelected;
  });
  int rowCount = selectedRows.Count;

0
投票

使用会话或状态来存储:

protected void Set_CheckboxStatus()
    {
        CheckBox selectall = (CheckBox)EmployeeGrid.HeaderRow.FindControl("gcb_selectall");
        ArrayList cbstatuslist = new ArrayList();
        if (Session["childcbstatus"] != null)
        {
            cbstatuslist = (ArrayList)Session["childcbstatus"];
        }
        foreach (GridViewRow row in EmployeeGrid.Rows)
        {
            int cb_index = (int)row.DataItemIndex;  //For Getting DataItemIndex of EmployeeGrid 
            //int cb_index = (int)row.RowIndex;
            CheckBox cb_selemp = (CheckBox)row.FindControl("gcb_selemp");
            CheckBox cb_active = (CheckBox)row.FindControl("gcb_active");

            if (cb_selemp.Checked == true)
            {
                if (!cbstatuslist.Contains(cb_index))
                    cbstatuslist.Add(cb_index);
            }
            else
            {
                cbstatuslist.Remove(cb_index);
            }
        }
        Session["childcbstatus"] = cbstatuslist;
    }

从数组列表中,您可以获取要循环的所有行索引,并通过分页从 gridview 中获取值。


0
投票

@CRice的答案应该是官方答案。

这是我的解决方案。您需要通过其

DataSource
预先保存 gridview 的数据到
ViewState
Session

GridView.Rows 仅指“可见”行,或当前在屏幕上显示的页面。

    protected void GridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView gv = (GridView)sender;

        DataSourceSelectArguments dss = new DataSourceSelectArguments();

    //get the datasource related to the gridview
    string wsDataSourceID = (gv.DataSourceID == string.Empty) ? ViewState["DataSourceID"].ToString() : gv.DataSourceID;
    SqlDataSource sds = (SqlDataSource)pnlMAIN.FindControl(wsDataSourceID);
    if (sds != null)
    {
        //load the data again but this time into a dataview object
        DataView dv = (DataView)sds.Select(DataSourceSelectArguments.Empty);
        if (dv != null)
        {
            //convert the dataview to a datatable so we can see the row(s)
            DataTable dt = (DataTable)dv.ToTable();
            if (dt != null)
            {
                //Save your data before changing pages
                ViewState["AllTheData"] = dt;

                gv.DataSource = dt;
                gv.DataSourceID = null;
            }
        }
    }

    //now change pages!
        gv.PageIndex = e.NewPageIndex;
        gv.DataBind();
    }

接下来,换页的时候,这里我们保存数据

protected void GridView_PageIndexChanged(object sender, EventArgs e)
{
    GridView gv = (GridView)sender;

    DataSourceSelectArguments dss = new DataSourceSelectArguments();

    //reload the datatable back to the gridview
    gv.DataSource = ViewState["AllTheData"];
    gv.DataSourceID = null;
    gv.DataBind();

我希望代码能够说明一切。

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.