GridView页面索引

问题描述 投票:1回答:1

我正在使用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会返回“10”

debug result of command argument

(转换为数组中的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];
        }

变量索引返回10并且发生错误,因为该值(数组中的11个元素)大于网格的页面大小并且它没有“找到”行,就像错误中所说的那样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"/>
c# asp.net sql-server gridview webforms
1个回答
1
投票

问题似乎来自下面的CommandArgument属性定义:

CommandArgument="<%# Container.DataItemIndex %>"

根据参考,DataItemIndex返回一个值,不管当前的页码,Rows集合索引依赖于PageSize设置,它永远不会超过页面大小限制,因此ArgumentOutOfRangeException将在访问带有相应索引的Rows集合时抛出。

这个问题的一个简单的解决方法是使用网格的PageSize属性对CommandArgument进行模运算,并将其值用作行索引:

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

© www.soinside.com 2019 - 2024. All rights reserved.