【问题标题】:DetailsView: Index was out of range详细信息视图:索引超出范围
【发布时间】:2011-05-31 05:28:25
【问题描述】:

我正在尝试从DetailsView 获取数据键值并将其粘贴到表单中。我已经包含了所有数据键名,但仍然无法获得将其粘贴到我的表单视图中的值,但我遇到了这个问题:

索引超出范围。一定是 非负且小于 集合。参数名称:索引

我试过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" />
                &nbsp;<asp:LinkButton ID="InsertCancelButton" runat="server" 
                    CausesValidation="False" CommandName="Cancel" Text="Cancel" />
            </InsertItemTemplate>
            <ItemTemplate>

【问题讨论】:

  • 你到底在哪里得到了异常??
  • 在哪一行抛出异常?我的意思是,索引从零开始,所以你可能没有索引二...
  • 我已经编辑了我的帖子,请看一下。我只想获取数据键值“bookid”、“EmployeeID”和“reservedate”并将其粘贴到 FormView 中。
  • 我在编辑您的问题后编辑了我的答案。试试吧,你会看到神奇的:)

标签: c# .net asp.net detailsview


【解决方案1】:

这是访问DataItem 值的更好方法

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

【讨论】:

  • 遇到错误:对象引用未设置为对象的实例。我会像往常一样尝试修复它。
  • 进行空检查。直接在检索到的值上调用 ToString 绝不是一个好主意。它也可以为 null ..
【解决方案2】:

您确定您的 DetailsView1.DataKey[1] 不是从 [0] 开始吗?

【讨论】:

  • 是的,因为我只需要里面的其他数据而不是主键。在我的表中,我有一个主键、一个 bookid、一个employeeid,所以我想获取 bookid 和employeeid。
  • @Loupi;你有两个数据键?你能显示你的来源你提到的地方吗?
  • 我已经编辑了我的帖子。请看一看。我需要检索三个数据键值“bookid”、“EmployeeID”和“reservedate”
猜你喜欢
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 2021-01-16
  • 2013-11-14
  • 1970-01-01
  • 2018-03-01
相关资源
最近更新 更多