VS 2012, VB.net, Winforms(桌面应用程序)
当我更改组合框(combo_company. com)的项目时。System.NullReferenceException SelectedIndexChanged事件),我得到错误。
我正试图获得combo_company的值。设置SelectedItem和combo_company。SelectedValue。我尝试了两种方式绑定组合框,但问题是:
case 1输出:
combo_company。SelectedItem= output OK
combo_company。SelectedValue =系统。得到NullReferenceException
case 2输出:
combo_company。SelectedItem= System.Data.DataRowview
combo_company。SelectedValue= output OK
两种情况的通用代码:
Dim da As New SqlDataAdapter
Dim cmd As New SqlCommand
Dim dt As New DataTable
cmd.Connection = con
Dim sql As String = "select company_name, company_id from tbl_company"
cmd = New SqlCommand(sql, con)
If con.State = ConnectionState.Open Then con.Close()
con.Open()
da = New SqlDataAdapter(cmd)
da.Fill(dt)
case 1 code:
combo_company.DisplayMember = "company_name"
combo_company.ValueMember = "company_id"
If dt.Rows.Count >= 1 Then
For i = 0 To dt.Rows.Count - 1
combo_company.Items.Add(dt.Rows(i).Item(0).ToString)
Next
End If
case 1输出:
combo_company。SelectedItem= output OK
combo_company。SelectedValue =系统。得到NullReferenceException
case 2代码:
combo_company.DisplayMember = "company_name"
combo_company.ValueMember = "company_id"
combo_company.DataSource = dt
case 2输出:
combo_company。SelectedItem= System.Data.DataRowview
combo_company。SelectedValue= output OK
您的案例2是您应该做的,并且它正在正常工作。当你绑定DataTable
WinForms控制,数据实际上来自于DefaultView
DataView
。DataView
中的每个项目都是DataRowView
,因此绑定控件的SelectedItem
将是DataRowView
,这正是您所看到的。
你说你想要SelectedItem
,但我不认为这是实际情况,因为SelectedItem
是整个行。我怀疑你真正想要的是company_name
值从那一行,即ComboBox
中显示的文本。要获得它,您可以使用ComboBox
的Text
属性。SelectedValue
将为您提供ValueMember
中指定的列的值,Text
将为您提供DisplayMember
中指定的列的值(作为String
)。
详细说明第一段,WinForms中的复杂数据绑定需要实现IList
接口或IListSource
接口的对象。IListSource
接口有一个方法:GetList
,它返回一个IList
。如果绑定IList
,则使用其项。如果绑定IListSource
,则调用其GetList
方法,并使用返回的IList
的项。DataTable
类实现IListSource
接口,它的GetList
方法返回它的DefaultView
属性值,这是一个DataView
,它实现IList
并包含DataRowView
对象。当您绑定DataTable
时,您看到的数据来自它的DefaultView
,这就是您能够过滤和排序绑定数据的方式。