¿Cómo conseguir un valor entero de un cuadro combinado utilizando un DataTable como su origen de datos

StackOverflow https://stackoverflow.com/questions/3106335

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
¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top