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
Retrieving all GridViewRow objects from a GridView control with paging enabled
提问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 ViewState
or 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
谢谢