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