2010-06-23 73 views
1

我使用的代码与此类似,用于从数据库中填充组合框的组合框。显示效果很好,但是当我尝试获取combobox.SelectedValue时,它返回一个DataRowView,我需要一个整数。很明显,这是因为我没有将值转换为整数,但函数CInt(cboPosition.SelectedValue)正在抛出一个InvalidCastException异常。有什么方法可以让ValueMember的类型成为Integer?如何从使用DataTable作为DataSource的ComboBox获取Integer值

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 

回答

2

您需要选择这两个领域在SQL IDText

如果您确实选择了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设置,我不知道。 ..


编辑2:我找到了原因为什么SelectedValue重新打开整行而不只是ValueMember:你have to set the properties in the "right" order,即:

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

(第一DisplayMemberValueMember然后DataSource。)

+0

正如我所说的,上面的代码仅是相似的。我正在使用_does_的存储过程返回ID和Description字段;该部分工作正常。问题是,SelectedValue的类型是'DataRowView' – 2010-06-23 23:52:37

+0

我编辑了答案以显示我正在使用的查找的实际代码。 – 2010-06-23 23:53:47

+0

只是为了确保:你*是*使用'SelectedValue'而不是'SelectedItem',对吗?我已经更新了我的答案。 – Heinzi 2010-06-24 00:01:58

相关问题