0

为什么在尝试从 ASP.net 2.0 vb 中的 DropDownList 中预选值时出现运行时错误?

我试图用 GridView 做同样的事情,我得到了同样的信息。

最初,我试图向用户展示他们提交的申请访问权限的详细信息。单击编辑按钮时,我希望允许用户更改他们提交给我们的详细信息并更新应用程序。我不打算在数据库中进行任何额外的插入。

我想限制用户从下拉列表中选择部门。当用户点击编辑时,我希望他们最初申请的部门被预先选择。当我有线路时:

SelectedValue='<%# Bind("department") %>'

我收到运行时错误。如果我删除该行,它不会出错,但不会预先选择任何东西。

有人能帮我理解为什么它不起作用吗?

其他可能有帮助的是我正在使用 Visual Studio 2005,并且当我键入时,类属性会在我键入时显示。当我按下空格键时,我可以看到 DropDownList 的许多属性,但 SelectedValue 不是其中之一,这让我觉得我正在尝试做一些不应该工作的事情。

我的代码:

<asp:SqlDataSource ID="UserDetails_Conn" runat="server" 
    ConnectionString="<%$ ConnectionStrings:NormCon %>" 
    SelectCommand="SELECT u.first_name, u.last_name, u.email, d.department FROM mis_userlist AS u INNER JOIN mis_depts AS d ON u.dept_id = d.dept_id WHERE (u.windows_login = @windows_ID)"
    UpdateCommand="UPDATE mis_userlist SET first_name = @first_name, last_name = @last_name, email = @email, dept_id = @dept_id WHERE (windows_login = @windows_ID)"
>
    <SelectParameters>
        <asp:SessionParameter Name="windows_ID" SessionField="username" />
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="first_name" />
        <asp:Parameter Name="last_name" />
        <asp:Parameter Name="email" />
        <asp:Parameter Name="dept_id" />
        <asp:Parameter Name="windows_ID" />
    </UpdateParameters>

</asp:SqlDataSource>
<asp:DetailsView ID="UserDetailsView" runat="server" Height="50px" Width="125px" AutoGenerateRows="False" DataSourceID="UserDetails_Conn">
    <Fields>
        <asp:BoundField DataField="first_name" HeaderText="first_name" SortExpression="first_name" />
        <asp:BoundField DataField="last_name" HeaderText="last_name" SortExpression="last_name" />
        <asp:BoundField DataField="email" HeaderText="email" SortExpression="email" />
        <asp:TemplateField HeaderText="department" SortExpression="department">
            <EditItemTemplate>
                <asp:SqlDataSource ID="DepartmentList" runat="server" 
                    ConnectionString="<%$ ConnectionStrings:NormCon %>" 
                    SelectCommand="SELECT dept_id, department FROM mis_depts ORDER BY department"
                >
                </asp:SqlDataSource>
                <asp:DropDownList ID="ddlDepartments" runat="server"
                    DataSourceId="DepartmentList"
                    DataTextField="department"
                    DataValueField="dept_id"
                    SelectedValue='<%# Bind("department") %>' > <!-- Errorsome line -->
                </asp:DropDownList>
            </EditItemTemplate>
            <InsertItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("department") %>'></asp:TextBox>
            </InsertItemTemplate>
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("department") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:CommandField ShowEditButton="True" />
    </Fields>
</asp:DetailsView>

解决方案

连同 Win 的解决方案,我需要在 SQL 字符串中添加 dept_id 字段。

SelectCommand="SELECT u.first_name, u.last_name, u.email, d.department, d.dept_id FROM mis_userlist AS u INNER JOIN mis_depts AS d ON u.dept_id = d.dept_id WHERE (u.windows_login = @windows_ID)"

这允许在此处表示的部门:ddlDepartments.SelectedValue = Department
成为可以与 DropDownList 中的 DataValueField="dept_id" 行链接的值。

感谢胜利。

4

1 回答 1

0

SelectedValue如果您分配列表中不存在的值,将引发异常。

为了避免这种情况,您可以在DataBound中进行验证-

从 aspx 页面中删除SelectedValue='<%# Bind("department") %>',并将数据绑定事件附加到 UserDetailsView<asp:DetailsView ... OnDataBound="DetailsView_DataBound" ...

Protected Sub DetailsView_DataBound(sender As Object, e As EventArgs)
   Dim detailsView = DirectCast(sender, DetailsView)

   Dim dr = DirectCast(detailsView.DataItem, DataRowView)
   Dim department = dr(4).ToString() ' Column index of department
   *** OR *** Dim department = dr("department").ToString() ' Column by name
   Dim ddlDepartments = TryCast(detailsView.
      FindControl("ddlDepartments"), DropDownList)

   If ddlDepartments IsNot Nothing AndAlso 
      ddlDepartments.Items.FindByValue(department) IsNot Nothing Then
      ddlDepartments.SelectedValue = department
   End If
End Sub

基本上,您正在拦截控件的数据绑定。

更新:检查部门列的索引。 在此处输入图像描述

于 2013-02-13T18:35:42.220 回答