¿Cómo conseguir un valor entero de un cuadro combinado utilizando un DataTable como su origen de datos
-
29-09-2019 - |
Pregunta
Estoy utilizando código similar al siguiente para llenar un cuadro combinado con elementos de una base de datos. La pantalla funciona bien, pero cuando trato de conseguir la combobox.SelectedValue
se está volviendo un DataRowView, donde necesito un entero. Obviamente, esto es becuase no he fundido el valor a un entero, pero la función, CInt(cboPosition.SelectedValue)
está lanzando una InvalidCastException. ¿Hay alguna manera de que puedo conseguir el tipo del ValueMember a ser un número entero?
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
Solución
Es necesario seleccionar tanto los campos ID
y Text
en su SQL.
Si ha seleccionado ID
, puede utilizar MsgBox TypeName(cboPosition.SelectedValue)
para determinar el tipo del valor seleccionado. Esto podría ayudar con la depuración.
EDIT: Si SelectedValue
devuelve un DataRowView
, se puede acceder al campo ID
como esto:
Dim myDataRowView As DataRowView = DirectCast(cboPosition.SelectedValue, DataRowView)
Dim myId as Integer = CInt(myDataRowView("CustomerID"))
En cuanto a porqué SelectedValue
devuelve el DataRowView
aunque un ValueMember
correcta es fijo, no tengo ni idea ...
Edit2: He encontrado la razón por la SelectedValue
devuelve toda la fila en lugar de sólo la ValueMember
: Usted tener para establecer las propiedades en el "derecho" orden , es decir:
uxCustomerName.DisplayMember = "CustomerName"
uxCustomerName.ValueMember = "CustomerID"
uxCustomerName.DataSource = dt
(Primera DisplayMember
y ValueMember
, después DataSource
.)