GridView 页面索引
GridView Page Index
我正在使用 GridView 来显示数据库中的数据,但我在使用 PageIndex 时遇到问题,分页工作正常我可以看到所有信息,但我对放置在末尾的按钮有疑问每行至极操作是删除一行
在网格视图中,按钮在第一页中工作得很好,删除行的操作工作正常,但是当我切换到第二页时
Exception thrown: 'System.ArgumentOutOfRangeException' in mscorlib.dll ("Index was out of range. Must be non-negative and less than the size of the collection.")
问题是我的 GridView 的页面大小设置为 10,因此在第一页中,行设置(显然像一个数组)从 0 到 9,但是当我切换到第二页时,数组继续从 10 到 19,所以如果我单击第二页第一行的按钮,CommandArgument returns "10"
(转换为数组中的第 11 个元素)并且它大于 gridview 的页面大小
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
FillGrid();
}
public void FillGrid()
{
Methods metodos = new Methods();
string query = "SELECT * FROM ul";
GridView1.DataSource = metodos.Query(query);
GridView1.DataBind();
}
错误发生在这里
if (e.CommandName == "btnDelete")
{
int index = Convert.ToInt32(e.CommandArgument);
//Get row number
GridViewRow row = GridView1.Rows[index];
}
变量索引 returns 10 并且发生错误是因为该值(数组中的第 11 个元素)大于网格的页面大小并且它不是 "finding" 像错误一样的行说 less than the size of the collection
我试过设置 GridView1.PageIndex = 0;但是分页停止工作,如果在设置 GridView1.PageIndex = e.NewPageIndex 之后放置数据绑定;分页再次停止工作
编辑:这是 gridview 上的按钮
<asp:Button runat="server" Text="Delete CommandName="btnDelete" CommandArgument="<%# Container.DataItemIndex %>" CausesValidation="false"/>
问题似乎来自下面的 CommandArgument
属性 定义:
CommandArgument="<%# Container.DataItemIndex %>"
根据参考资料,DataItemIndex
returns 一个值与当前页码无关,Rows
集合索引取决于 PageSize
设置,该设置永远不会超过页面大小限制,因此 ArgumentOutOfRangeException
将在访问具有相应索引的 Rows
集合时抛出。
此问题的一个简单解决方法是对 CommandArgument
使用网格的 PageSize
属性 的模运算,并将其值用作行索引:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "btnDelete")
{
int index = (Convert.ToInt32(e.CommandArgument)) % GridView1.PageSize;
//Get row number
GridViewRow row = GridView1.Rows[index];
}
}
参考:
GridViewRow.DataItemIndex (MS Docs)
类似问题:
“Index was out of range” when Accessing the DataKeys Collection in a Paged GridView
我正在使用 GridView 来显示数据库中的数据,但我在使用 PageIndex 时遇到问题,分页工作正常我可以看到所有信息,但我对放置在末尾的按钮有疑问每行至极操作是删除一行
在网格视图中,按钮在第一页中工作得很好,删除行的操作工作正常,但是当我切换到第二页时
Exception thrown: 'System.ArgumentOutOfRangeException' in mscorlib.dll ("Index was out of range. Must be non-negative and less than the size of the collection.")
问题是我的 GridView 的页面大小设置为 10,因此在第一页中,行设置(显然像一个数组)从 0 到 9,但是当我切换到第二页时,数组继续从 10 到 19,所以如果我单击第二页第一行的按钮,CommandArgument returns "10"
(转换为数组中的第 11 个元素)并且它大于 gridview 的页面大小
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
FillGrid();
}
public void FillGrid()
{
Methods metodos = new Methods();
string query = "SELECT * FROM ul";
GridView1.DataSource = metodos.Query(query);
GridView1.DataBind();
}
错误发生在这里
if (e.CommandName == "btnDelete")
{
int index = Convert.ToInt32(e.CommandArgument);
//Get row number
GridViewRow row = GridView1.Rows[index];
}
变量索引 returns 10 并且发生错误是因为该值(数组中的第 11 个元素)大于网格的页面大小并且它不是 "finding" 像错误一样的行说 less than the size of the collection
我试过设置 GridView1.PageIndex = 0;但是分页停止工作,如果在设置 GridView1.PageIndex = e.NewPageIndex 之后放置数据绑定;分页再次停止工作
编辑:这是 gridview 上的按钮
<asp:Button runat="server" Text="Delete CommandName="btnDelete" CommandArgument="<%# Container.DataItemIndex %>" CausesValidation="false"/>
问题似乎来自下面的 CommandArgument
属性 定义:
CommandArgument="<%# Container.DataItemIndex %>"
根据参考资料,DataItemIndex
returns 一个值与当前页码无关,Rows
集合索引取决于 PageSize
设置,该设置永远不会超过页面大小限制,因此 ArgumentOutOfRangeException
将在访问具有相应索引的 Rows
集合时抛出。
此问题的一个简单解决方法是对 CommandArgument
使用网格的 PageSize
属性 的模运算,并将其值用作行索引:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "btnDelete")
{
int index = (Convert.ToInt32(e.CommandArgument)) % GridView1.PageSize;
//Get row number
GridViewRow row = GridView1.Rows[index];
}
}
参考:
GridViewRow.DataItemIndex (MS Docs)
类似问题:
“Index was out of range” when Accessing the DataKeys Collection in a Paged GridView