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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/774406/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 00:39:11  来源:igfitidea点击:

Retrieving all GridViewRow objects from a GridView control with paging enabled

c#asp.netgridviewpaging

提问by Michael Kniskern

I currently have a GridView control on my aspx page with paging enabled and I need to loop through the entire row collection/count to process the selected records. With my current code, it will only loop through the current page of GridView row.

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

What is the best way to accomplish this task?

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

Here is my current code:

这是我当前的代码:

ASPX page:

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

code behind:

后面的代码:

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
    }   
}

回答by Canavar

I think you should get the row count from your data source's row count.

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

If you need to filter rows, you can use DataTable's / DataView's Selectmethod.

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

EDIT :You can not get actual row count by gridview.Rows.Count if gridview is paged. Depending on your comment, I assume that you're using listDataSource generic list to bind your gridview, you can get your row count as :

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

回答by CRice

Yes because your gridview UI is only aware of the current page. Get the datasource and determine the row count from there...

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

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

//or

//或者

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

回答by Nithin

Simply use the following code:

只需使用以下代码:

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

This may help you, let me know if this was helpful for you...

这可能对你有帮助,如果这对你有帮助,请告诉我...

回答by thangarai vendhan e

use session or state to store:

使用会话或状态来存储:

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;
    }

from the arraylist you can get all row index to loop and get the value from the gridview with paging.

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

回答by Fandango68

@CRice's answer should have been the official answer.

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

Here is my solution. You need to presave the gridview's data, via its DataSource, into ViewStateor Session.

这是我的解决方案。您需要将 gridview 的数据通过它的DataSource, 保存到ViewState或 中Session

GridView.Rows only refers to the "visible" rows, or the page currently shown on the screen.

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

Next, when changing pages, here we save the data

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

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

I hope the code speaks for itself.

我希望代码不言自明。

Thanks

谢谢