Question

J'utilise un code similaire à ceci pour remplir une zone de liste déroulante avec des éléments d'une base de données. L'affichage fonctionne très bien, mais lorsque je tente d'obtenir le combobox.SelectedValue il renvoie une DataRowView, où je besoin d'un nombre entier. Il est évident que cela est dommage parce que je ne l'ai pas casted la valeur à un nombre entier, mais la fonction, CInt(cboPosition.SelectedValue) est de lancer un InvalidCastException. Est-il possible que je puisse obtenir le type de l'ValueMember être un entier?

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
Était-ce utile?

La solution

Vous devez sélectionner les deux champs ID et Text dans votre SQL.

Si vous avez sélectionnez ID, vous pouvez utiliser MsgBox TypeName(cboPosition.SelectedValue) pour déterminer le type de la valeur sélectionnée. Cela peut vous aider avec le débogage.


EDIT: Si SelectedValue retourne un DataRowView, vous pouvez accéder au champ ID comme ceci:

Dim myDataRowView As DataRowView = DirectCast(cboPosition.SelectedValue, DataRowView)
Dim myId as Integer = CInt(myDataRowView("CustomerID"))

Quant à savoir pourquoi SelectedValue retourne le DataRowView bien qu'un ValueMember correct est ensemble, je ne sais pas ...


EDIT2: J'ai trouvé la raison pour laquelle SelectedValue retourne toute la ligne au lieu de simplement le ValueMember: Vous doivent définir les propriétés dans l'ordre « droit » , à savoir:

    uxCustomerName.DisplayMember = "CustomerName"
    uxCustomerName.ValueMember = "CustomerID"
    uxCustomerName.DataSource = dt

(première DisplayMember et ValueMember, puis DataSource.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top