请问是什么导致这个“索引超出范围必须是非负...错误”?

时间:2012-03-12 17:16:58

标签: asp.net outofrangeexception

请有人真的告诉我这段代码有什么问题,我有这个错误:

System.ArgumentOutOfRangeException was caught
Message=Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

int index = Int32.Parse(e.CommandArgument.ToString());
long Id = long.Parse(gvGrid.DataKeys[index][0].ToString());
var stuobj = ctx.stockUnits.SingleOrDefault(st => st.ID == Id);

                        if (stuobj != null)
                            this.txtStockUnit.Text = stuobj.NAME;

                        ViewState["Id"] = Id; 

在标记(设计师来源)中,这就是我所拥有的:

<asp:GridView ID="gvGrid" runat="server" 
            OnPageIndexChanging = "gvGrid_PageIndexChanging" AutoGenerateColumns="False" 
            BackColor="White" CssClass = "mGrid"  DataKeyNames ="Id,NAME"
                OnRowCommand="gvGrid_RowCommand"

...<Columns>

        <asp:BoundField DataField="NAME" HeaderText="STOCK UNIT NAME" HeaderStyle-CssClass="Headerhodder"
                        FooterStyle-CssClass="Headerhodder" ItemStyle-HorizontalAlign="Left"  HeaderStyle-HorizontalAlign="Left" 
                        ItemStyle-VerticalAlign="Middle" />
           <asp:TemplateField HeaderStyle-CssClass="Headerhodder" FooterStyle-CssClass="Headerhodder"
                        ItemStyle-HorizontalAlign="Center"  ItemStyle-Width="50px"
            ItemStyle-VerticalAlign="Middle">
            <ItemTemplate>

                            <asp:ImageButton ID="imgEdit" runat="server" ImageUrl="~/img/pencil.png" CommandName="EditStockUnit" CommandArgument ='<%# Container.DataItemIndex %> '
                            AlternateText="Edit Stock Unit" ToolTip="Edit Stock unit record"  CausesValidation="false" />

这里有什么遗漏?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

当您尝试访问其边界之外的集合的元素时(例如,9元素数组的元素10),会发生此错误。我对您使用的语言并不是特别熟悉,但下面的代码看起来使用的值可能超出了集合gvGrid.DataKeys的范围。

int index = Int32.Parse(e.CommandArgument.ToString());
long Id = long.Parse(gvGrid.DataKeys[index][0].ToString());

如果您执行某种理智检查,例如对于传入的索引if( index < count ),为了确保它不大于最后一个可索引元素,你不应该得到异常。

答案 1 :(得分:0)

效果很好,只需使用以下代码

string Id = gvGrid.DataKeys[index %= gvGrid.PageSize][0].ToString();

所以享受你的编码......