Comment obtenir une valeur entière d'un ComboBox en utilisant un DataTable comme DataSource
-
29-09-2019 - |
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
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
.)