2012-03-12 80 views
1

请能有人真正告诉我有什么不对的代码,我有这样的错误:请问这是什么原因导致“索引超出范围必须是非负的...错误”?

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

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

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

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

+0

感谢骆马。我想我知道我要做什么。我将使用模运算符来每次获取余数,并使用它来代替直接使用索引。我非常感谢您的回复.StackOverflow一直是解决方案的重要来源。祝你有个美好的一天 – Charles 2012-03-13 07:17:35

0

它的工作完美,只要使用以下行

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

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

相关问题