1

これに似たコードを使用して、コンボボックスにデータベースのアイテムを入力しています。表示は正常に機能しますが、取得しようとするとcombobox.SelectedValue、整数が必要なDataRowViewが返されます。明らかにこれは、値を整数にキャストしていないためですが、関数CInt(cboPosition.SelectedValue)はInvalidCastExceptionをスローしています。ValueMemberの型を整数にする方法はありますか?

Dim cn As New SqlConnection(CreditDisputesLogConn)
    Dim cmd As New SqlCommand("CustomersLookup", cn)
    Dim da As New SqlDataAdapter(cmd)
    cmd.CommandType = CommandType.StoredProcedure
    Try
        Dim dt As New DataTable
        da.Fill(dt)
        uxCustomerName.DataSource = dt
        uxCustomerName.DisplayMember = "CustomerName"
        uxCustomerName.ValueMember = "CustomerID"
        uxCustomerName.SelectedIndex = -1
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        cn.Close()
        cn.Dispose()
    End Try
4

1 に答える 1

2

IDSQLでフィールドとフィールドの両方を選択する必要がありTextます。

を選択した場合はID、を使用MsgBox TypeName(cboPosition.SelectedValue)して、選択した値のタイプを判別できます。これはデバッグに役立つ場合があります。


編集:をSelectedValue返す場合は、次のようにフィールドにDataRowViewアクセスできます。ID

Dim myDataRowView As DataRowView = DirectCast(cboPosition.SelectedValue, DataRowView)
Dim myId as Integer = CInt(myDataRowView("CustomerID"))

正しいが設定されているのになぜSelectedValue戻るのか、私にはわかりません...DataRowViewValueMember


SelectedValueEDIT2::だけでなく、行全体を返す理由を見つけました。プロパティを「正しい」順序で設定する必要がありますValueMember。つまり、次のようになります。

    uxCustomerName.DisplayMember = "CustomerName"
    uxCustomerName.ValueMember = "CustomerID"
    uxCustomerName.DataSource = dt

(最初DisplayMemberValueMember次に DataSource。)

于 2010-06-23T23:50:41.427 に答える