DetailsView: индекс был вне диапазона

#c# #.net #asp.net #detailsview

#c# #.net #asp.net #detailsview

Вопрос:

Я пытаюсь получить значение datakey из DetailsView и вставить его в форму. Я включил все имена данных, но все еще не смог получить значение, чтобы вставить его в мой formview, но я столкнулся с этой проблемой:

Индекс был вне диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс

Я пробовал SelectedValue и selectedRow, но он извлекает только первичные ключи.

Здесь прилагается мой исходный код. Помощь была бы очень признательна!

Заранее спасибо.

 protected void FormView1_DataBound(object sender, EventArgs e)
{
    if(FormView1.CurrentMode == FormViewMode.Insert)
    {
        TextBox bookid = FormView1.FindControl("bookidTextBox") as TextBox;
        bookid.Text = DetailsView1.DataKey[1].ToString();

        TextBox employee = FormView1.FindControl("EmployeeID") as TextBox;
        employee.Text = DetailsView1.DataKey[2].ToString();
    }
}
  

Вот код из элемента управления

 <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" 
            DataKeyNames="reservationid,bookid,EmployeeID,reservedate" DataSourceID="booklendingDataSource" Height="50px" 
            Width="300px" >
            <Fields>

                <asp:CommandField ButtonType="Button" ShowSelectButton="true" SelectText="Lend" />
                <asp:BoundField DataField="reservationid, bookid, EmployeeID" HeaderText="reservationid" 
                    InsertVisible="False" ReadOnly="True" SortExpression="reservationid" 
                    Visible="false" />

                <asp:BoundField DataField="bookid" HeaderText="bookid" 
                    Visible="false" SortExpression="bookid" />

                <asp:BoundField DataField="booktitle" HeaderText="Title" 
                    SortExpression="booktitle" />

                <asp:BoundField DataField="EmployeeID" HeaderText="Emp PIN" 
                    SortExpression="EmployeeID" />

                <asp:BoundField DataField="reservedate" HeaderText="Reserve date" 
                    SortExpression="reservedate" />

                <asp:CheckBoxField DataField="isdeleted" HeaderText="Deleted" 
                    SortExpression="isdeleted" />

            </Fields>
        </asp:DetailsView>
...

<asp:FormView ID="FormView1" runat="server" DataKeyNames="lenid" 
            DataSourceID="lendformDataSource" DefaultMode="Insert" OnDataBound="FormView1_DataBound" >
            <EditItemTemplate>

        ...

            </EditItemTemplate>
            <InsertItemTemplate>
                bookid:
                <asp:TextBox ID="bookidTextBox" runat="server" 
                    Text='<%# Bind("bookid") %>' />
                <br />
                EmployeeID:
                <asp:TextBox ID="EmployeeIDTextBox" runat="server" 
                    Text='<%# Bind("EmployeeID") %>' />
                <br />
                department:
                <asp:TextBox ID="departmentTextBox" runat="server" 
                    Text='<%# Bind("department") %>' />
                <br />
                dateborrowed:
                <asp:TextBox ID="dateborrowedTextBox" runat="server" 
                    Text='<%# Bind("dateborrowed") %>' />
                <br />
                expdateofreturn:
                <asp:TextBox ID="expdateofreturnTextBox" runat="server" 
                    Text='<%# Bind("expdateofreturn") %>' />
                <br />

                <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" 
                    CommandName="Insert" Text="Insert" />
                amp;nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server" 
                    CausesValidation="False" CommandName="Cancel" Text="Cancel" />
            </InsertItemTemplate>
            <ItemTemplate>
  

Комментарии:

1. Где именно вы получили исключение??

2. в какой строке генерируется исключение? Я имею в виду, что индексы начинаются с нуля, поэтому у вас может не быть второго индекса…

3. Я отредактировал свой пост, пожалуйста, взгляните. Я просто хочу получить значения datakey ‘bookid’, ‘EmployeeID’ и ‘reservedate’ и вставить их в FormView.

4. Я отредактировал свой ответ после редактирования вашего вопроса. просто попробуйте, и вы увидите волшебство 🙂

Ответ №1:

Это лучший способ получить доступ к значениям DataItem

 bookid.Text = ((DataRowView)DetailsView1.DataItem)["bookid"].ToString();
employee.Text = ((DataRowView)DetailsView1.DataItem)["EmployeeID"].ToString();
  

Комментарии:

1. Получена ошибка: ссылка на объект не установлена на экземпляр объекта. Я постараюсь исправить это как обычно.

2. Установите нулевую проверку. Никогда не рекомендуется вызывать toString для извлеченного значения напрямую.. Он также может быть нулевым..

Ответ №2:

Вы уверены, что ваш DetailsView1.DataKey[1] не начинается с [0]?

Комментарии:

1. Да, потому что мне нужны только другие данные внутри, а не первичный ключ. В моей таблице у меня есть первичный ключ, идентификатор книги, идентификатор сотрудника, поэтому я хочу получить идентификатор книги и идентификатор сотрудника.

2. @Loupi; у вас есть два Ключа данных? Можете ли вы показать свой источник , о котором вы упомянули ?

3. Я отредактировал свой пост. Пожалуйста, взгляните. Мне нужно получить три значения ключа данных ‘bookid’, ‘EmployeeID’ и ‘reservedate’