我正在使用类似的代码来填充数据库中的项目。显示屏正常,但是当我尝试获得 combobox.SelectedValue 它正在返回DataRowView,我需要一个整数。显然这是因为我没有将价值投入整数,但是功能, CInt(cboPosition.SelectedValue) 正在抛出无效的castexception。有什么办法可以使估价人员的类型成为整数?

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
有帮助吗?

解决方案

您需要选择两个字段 IDText 在您的SQL中。

如果您确实选择了 ID, , 您可以使用 MsgBox TypeName(cboPosition.SelectedValue) 确定所选值的类型。这可能会帮助您调试。


编辑:如果 SelectedValue 返回a DataRowView, ,您可以访问 ID 这样的字段:

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

关于原因 SelectedValue 返回 DataRowView 虽然是正确的 ValueMember 设置了,我不知道...


edit2:我找到了原因 SelectedValue 返回整个行,而不仅仅是 ValueMember: : 你 必须在“正确”订单中设置属性, , IE:

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

(第一的 DisplayMemberValueMember, 然后 DataSource.)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top