Frage

Ich verwende Code ähnlich wie diese, um eine Combobox mit Elementen aus einer Datenbank zu füllen. Die Anzeige funktioniert gut, aber wenn ich versuche, die combobox.SelectedValue zu bekommen es ist ein DataRowView zurückkehrte, wo ich eine ganze Zahl benötigen. Offensichtlich ist dies weil ich den Wert auf eine ganze Zahl nicht gecastet haben, aber die Funktion ist CInt(cboPosition.SelectedValue) eine InvalidCastException werfen. Gibt es eine Möglichkeit, dass ich die Valuemember der Art bekommen kann ein Integer?

sein
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
War es hilfreich?

Lösung

Sie müssen beide Felder ID und Text in Ihrer SQL wählen.

Wenn Sie wählen ID haben, können Sie MsgBox TypeName(cboPosition.SelectedValue) verwenden, um die Art des gewählten Wert zu bestimmen. Dies könnte Ihnen helfen, mit dem Debuggen.


EDIT: Wenn SelectedValue eine DataRowView zurückgibt, können Sie das ID Feld wie folgt zugreifen:

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

Wie, warum SelectedValue gibt die DataRowView obwohl eine korrekte ValueMember Satz ist, ich habe keine Ahnung ...


EDIT2: Ich fand den Grund, warum SelectedValue die ganze Zeile zurückgibt, anstatt nur die ValueMember: Sie müssen die Eigenschaften in der „richtigen“ Reihenfolge gesetzt, dh:

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

(Erster DisplayMember und ValueMember, und DataSource.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top