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