Come ottenere un valore intero da una casella combinata utilizzando un DataTable come DataSource

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

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
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top