Пожалуйста, что вызывает это "Индекс был вне диапазона должен быть неотрицательным ... ошибка"? - PullRequest
1 голос
/ 12 марта 2012

Пожалуйста, может кто-нибудь действительно сказать мне, что не так с этим кодом, что у меня появляется эта ошибка:

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; 

В разметке (источник Designer) это то, что у меня есть:

<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 ]

2 голосов
/ 12 марта 2012

Эта ошибка возникает, когда вы пытаетесь получить доступ к элементу коллекции, который находится за ее пределами (например, элемент 10 массива из 9 элементов).Я не особенно знаком с языком, который вы используете, но приведенный ниже код выглядит так, как будто он использует значение, которое может быть вне диапазона коллекции gvGrid.DataKeys.

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

Если вы выполните некоторыесвоего рода проверка работоспособности, например, if( index < count ) переданного индекса, чтобы убедиться, что он не больше, чем последний индексируемый элемент, вы не должны получать исключение.

0 голосов
/ 13 марта 2012

Отлично сработало, просто используйте следующую строку вместо

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

Так что наслаждайтесь кодированием ....

...