0

ASP.net 2.0 vb で DropDownList から値を事前に選択しようとすると、ランタイム エラーが発生するのはなぜですか?

GridView で同じことをしようとしましたが、同じメッセージが表示されます。

最初に、アクセスを申請するために送信した詳細をユーザーに表示しようとしています。編集ボタンをクリックすると、ユーザーが送信した詳細を変更してアプリケーションを更新できるようにしたいと考えています。データベースに追加の挿入を行うつもりはありません。

ユーザーが DropDownList から部門を選択するように制限したかったのです。ユーザーが編集をクリックすると、最初に応募した部門が事前に選択されます。私が行を持っているとき:

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

ランタイム エラーが発生します。行を削除すると、エラーにはなりませんが、何も事前選択されません。

なぜそれが機能しないのかを理解するのを手伝ってくれる人はいますか?

私が Visual Studio 2005 を使用していて、入力時にクラス プロパティが表示されていることが役立つかもしれません。スペースバーを押すと、DropDownList の多くのプロパティが表示されますが、SelectedValue はそれらのプロパティの 1 つではなく、機能しないはずのことをしようとしていると思われます。

私のコード:

<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)"

これにより、次のように部門を表す
ことができました。

ウィンのおかげです。

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 に答える