Come ottenere un valore intero da una casella combinata utilizzando un DataTable come DataSource
-
29-09-2019 - |
Domanda
Sto usando codice simile a questa per popolare una casella combinata con elementi da un database. Il display funziona bene, ma quando cerco di ottenere il combobox.SelectedValue
sta tornando un DataRowView, in cui ho bisogno di un numero intero. Ovviamente questo è becuase non ho colato il valore di un numero intero, ma la funzione, CInt(cboPosition.SelectedValue)
sta gettando un InvalidCastException. C'è un modo che io possa ottenere il tipo di ValueMember di essere un intero?
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
Soluzione
È necessario selezionare sia i campi ID
e Text
nel vostro SQL.
Se è stata selezionata ID
, è possibile utilizzare MsgBox TypeName(cboPosition.SelectedValue)
per determinare il tipo del valore selezionato. Questo potrebbe aiutare con il debug.
EDIT: Se SelectedValue
restituisce un DataRowView
, è possibile accedere al campo ID
in questo modo:
Dim myDataRowView As DataRowView = DirectCast(cboPosition.SelectedValue, DataRowView)
Dim myId as Integer = CInt(myDataRowView("CustomerID"))
Per quanto riguarda il motivo per cui SelectedValue
restituisce il DataRowView
anche se una corretta ValueMember
è impostato, non ho idea ...
EDIT2: ho trovato il motivo per cui SelectedValue
restituisce l'intera fila anziché solo la ValueMember
: È è necessario impostare le proprietà nel "giusto" ordine , vale a dire:
uxCustomerName.DisplayMember = "CustomerName"
uxCustomerName.ValueMember = "CustomerID"
uxCustomerName.DataSource = dt
(Prima DisplayMember
e ValueMember
, poi DataSource
.)