Error: System.NullReferenceException at combo_company.Select



VS 2012, VB.net, Winforms(桌面应用程序)
当我更改组合框(combo_company. com)的项目时。System.NullReferenceException SelectedIndexChanged事件),我得到错误。
我正试图获得combo_company的值。设置SelectedItemcombo_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是您应该做的,并且它正在正常工作。当你绑定DataTableWinForms控制,数据实际上来自于DefaultViewDataViewDataView中的每个项目都是DataRowView,因此绑定控件的SelectedItem将是DataRowView,这正是您所看到的。

你说你想要SelectedItem,但我不认为这是实际情况,因为SelectedItem是整个行。我怀疑你真正想要的是company_name值从那一行,即ComboBox中显示的文本。要获得它,您可以使用ComboBoxText属性。SelectedValue将为您提供ValueMember中指定的列的值,Text将为您提供DisplayMember中指定的列的值(作为String)。

详细说明第一段,WinForms中的复杂数据绑定需要实现IList接口或IListSource接口的对象。IListSource接口有一个方法:GetList,它返回一个IList。如果绑定IList,则使用其项。如果绑定IListSource,则调用其GetList方法,并使用返回的IList的项。DataTable类实现IListSource接口,它的GetList方法返回它的DefaultView属性值,这是一个DataView,它实现IList并包含DataRowView对象。当您绑定DataTable时,您看到的数据来自它的DefaultView,这就是您能够过滤和排序绑定数据的方式。

相关内容

  • 没有找到相关文章

最新更新