Wie einen Integer-Wert von einem ComboBox einer Datatable als Datasource erhalten mit
-
29-09-2019 - |
Frage
Ich verwende Code ähnlich wie diese, um eine Combobox mit Elementen aus einer Datenbank zu füllen. Die Anzeige funktioniert gut, aber wenn ich versuche, die combobox.SelectedValue
zu bekommen es ist ein DataRowView zurückkehrte, wo ich eine ganze Zahl benötigen. Offensichtlich ist dies weil ich den Wert auf eine ganze Zahl nicht gecastet haben, aber die Funktion ist CInt(cboPosition.SelectedValue)
eine InvalidCastException werfen. Gibt es eine Möglichkeit, dass ich die Valuemember der Art bekommen kann ein Integer?
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
Lösung
Sie müssen beide Felder ID
und Text
in Ihrer SQL wählen.
Wenn Sie wählen ID
haben, können Sie MsgBox TypeName(cboPosition.SelectedValue)
verwenden, um die Art des gewählten Wert zu bestimmen. Dies könnte Ihnen helfen, mit dem Debuggen.
EDIT: Wenn SelectedValue
eine DataRowView
zurückgibt, können Sie das ID
Feld wie folgt zugreifen:
Dim myDataRowView As DataRowView = DirectCast(cboPosition.SelectedValue, DataRowView)
Dim myId as Integer = CInt(myDataRowView("CustomerID"))
Wie, warum SelectedValue
gibt die DataRowView
obwohl eine korrekte ValueMember
Satz ist, ich habe keine Ahnung ...
EDIT2: Ich fand den Grund, warum SelectedValue
die ganze Zeile zurückgibt, anstatt nur die ValueMember
: Sie müssen die Eigenschaften in der „richtigen“ Reihenfolge gesetzt, dh:
uxCustomerName.DisplayMember = "CustomerName"
uxCustomerName.ValueMember = "CustomerID"
uxCustomerName.DataSource = dt
(Erster DisplayMember
und ValueMember
, und DataSource
.)