Как получить целочисленное значение из ComboBox, используя DataTable в качестве источника данных - PullRequest
1 голос
/ 24 июня 2010

Я использую код, подобный этому, чтобы заполнить комбинированный список элементами из базы данных.Дисплей работает нормально, но когда я пытаюсь получить 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

1 Ответ

2 голосов
/ 24 июня 2010

Вам нужно выбрать оба поля 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.)

...