Как получить целочисленное значение от ComboBox, используя DataTable в качестве данных

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

Вопрос

Я использую код, аналогичный этому, чтобы заполнить комбинированную комбинацию элементами из базы данных. Дисплей работает нормально, но когда я пытаюсь получить combobox.SelectedValue Это возвращает DataRowView, где мне нужно целое число. Очевидно, что это потому, что я не поддал значение целому числу, но функции, CInt(cboPosition.SelectedValue) бросает InvalidCastException. Есть ли способ, которым я могу заставить тип Valuemember быть целым числом?

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
Это было полезно?

Решение

Вам нужно выбрать оба поля ID и Text в вашем SQL.

Если вы выбрали ID, ты можешь использовать MsgBox TypeName(cboPosition.SelectedValue) Чтобы определить тип выбранного значения. Это может помочь вам в отладке.


РЕДАКТИРОВАТЬ: Если SelectedValue Возвращает а DataRowView, вы можете получить доступ к ID Поле, как это,:

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

Что касается почему SelectedValue возвращает DataRowView хотя правильный ValueMember установлен, я понятия не имею ...


EDIT2: я нашел причину, почему SelectedValue возвращает всю строку вместо только ValueMember: Ты нужно установить свойства в «правом» порядке, т.е.:

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

(Первый DisplayMember и ValueMember, потом DataSource.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top