2010-06-23 3 views
1

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 bien, mais quand j'essaie d'obtenir le combobox.SelectedValue, il renvoie un DataRowView, où j'ai besoin d'un entier. Évidemment c'est parce que je n'ai pas casted la valeur à un nombre entier, mais la fonction, CInt(cboPosition.SelectedValue) lève une exception InvalidCastException. Y a-t-il un moyen pour que le type de ValueMember soit Integer?Comment obtenir une valeur entière à partir d'une zone de liste déroulante en utilisant un DataTable comme source de données

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 

Répondre

2

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

Si vous avez sélectionné ID, vous pouvez utiliser MsgBox TypeName(cboPosition.SelectedValue) pour déterminer le type de la valeur sélectionnée. Cela pourrait 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 est établi un ValueMember correct, je ne sais pas. ..


EDIT2: J'ai trouvé la raison pour laquelle SelectedValue re tourne toute la ligne au lieu de simplement la ValueMember: Vous have to set the properties in the "right" order, i.e. .:

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

(Première DisplayMember et ValueMember, puisDataSource.)

+0

Comme je l'ai dit, le code ci-dessus est seulement similaire. La procédure stockée que j'utilise _does_ renvoie les champs ID et Description; cette partie fonctionne bien. Le problème est que le type de SelectedValue est 'DataRowView' –

+0

J'ai édité la réponse pour montrer le code réel pour la recherche que j'utilise. –

+0

Juste pour être sûr: Vous * utilisez * SelectedValue' et non 'SelectedItem', n'est-ce pas? J'ai mis à jour ma réponse. – Heinzi

Questions connexes