GridView页面索引

时间:2019-02-13 03:45:16

标签: c# asp.net sql-server gridview webforms

我正在使用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"/>

1 个答案:

答案 0 :(得分:0)

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

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

根据参考,DataItemIndex返回一个值,而与当前页码无关,并且Rows集合索引取决于PageSize的设置,该设置从未超过页面大小限制,因此{{1} }将访问带有相应索引的ArgumentOutOfRangeException集合时抛出。

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

CommandArgument

参考:

GridViewRow.DataItemIndex (MS Docs)

类似的问题:

“Index was out of range” when Accessing the DataKeys Collection in a Paged GridView