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

时间:2009-04-21 20:19:49

标签: c# asp.net gridview paging

我目前在我的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
    }   
}

5 个答案:

答案 0 :(得分:3)

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

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

//或

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

答案 1 :(得分: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();

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

答案 2 :(得分:1)

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

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

编辑:如果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;

答案 3 :(得分: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;
    }
来自arraylist的

你可以将所有行索引循环并通过分页从gridview获取值。

答案 4 :(得分:0)

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

这是我的解决方案。您需要将gridview的数据(DataSource)预先设置为ViewStateSession

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();

我希望代码说明一切。

由于