0

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

5 回答 5

3

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

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

//或者

        int count = ((ICollection<SomeRecord>)MyGridView.DataSource).Count;
于 2009-04-22T06:59:57.493 回答
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();

这可能会帮助你,让我知道这是否对你有帮助......

于 2011-11-09T05:21:31.103 回答
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;
于 2009-04-21T20:23:13.200 回答
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;
    }

从数组列表中,您可以获取所有行索引以循环并从带有分页的网格视图中获取值。

于 2013-02-01T12:52:49.020 回答
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();

我希望代码不言自明。

谢谢

于 2017-04-02T23:30:07.357 回答