Как получить Целочисленное значение от ComboBox с помощью DataTable в качестве его DataSource

Я использую код, подобный этому для заполнения поля комбинированного списка с объектами от базы данных. Дисплей хорошо работает, но когда я пытаюсь добраться combobox.SelectedValue это возвращает DataRowView, где мне нужно целое число. Очевидно, это - becuase, который я не имею литой значение к целому числу, но функция, 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
1
задан Caleb Thompson 23 June 2010 в 23:53
поделиться

1 ответ

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

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


EDIT: Если 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)

.
2
ответ дан 2 September 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: