提问人:Umesh 提问时间:7/10/2022 更新时间:7/10/2022 访问量:54
错误:System.NullReferenceException combo_company。SelectedIndexChanged 事件
Error: System.NullReferenceException at combo_company.SelectedIndexChanged event
问:
VS 2012、VB.net、Winforms(桌面应用程序)
当我更改组合框(combo_company的项目时。SelectedIndexChanged 事件),我收到错误 System.NullReferenceException。
我试图获得combo_company的价值。SelectedItem 和 combo_company。SelectedValue。我尝试以两种方式绑定组合框,但问题出在哪里:
案例 1 输出:
combo_company。SelectedItem= 输出 OK
combo_company。SelectedValue= System.NullReferenceException
案例 2 输出:
combo_company。SelectedItem= System.Data.DataRowview
combo_company。SelectedValue= 输出正常
两种情况的通用代码:
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)
案例 1 代码:
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
案例 1 输出:
combo_company。SelectedItem= 输出 OK
combo_company。SelectedValue= System.NullReferenceException
案例 2 代码:
combo_company.DisplayMember = "company_name"
combo_company.ValueMember = "company_id"
combo_company.DataSource = dt
案例 2 输出:
combo_company。SelectedItem= System.Data.DataRowview
combo_company。SelectedValue= 输出正常
答:
您的案例 2 是您应该做的,它完全按照应有的方式工作。当您将 绑定到 WinForms 控件时,数据实际上来自其 ,这是一个 .a 中的每个项目都是 ,因此绑定控件的 将是 ,这正是您所看到的。DataTable
DefaultView
DataView
DataView
DataRowView
SelectedItem
DataRowView
你说你想要,但我认为事实并非如此,因为这是整行。我怀疑您真正想要的是该行的值,即 .要获得该属性,请使用 .将为您提供 中指定的列中的值,而 将为您提供 中指定的列的值(作为 )。SelectedItem
SelectedItem
company_name
ComboBox
Text
ComboBox
SelectedValue
ValueMember
Text
String
DisplayMember
为了详细说明第一段,WinForms 中的复杂数据绑定需要一个实现接口或接口的对象。该接口有一个方法: ,它返回一个 .如果绑定一个,则使用其项目。如果绑定一个,则调用其方法并使用返回的项。该类实现接口,其方法返回其属性值,该值是一个 ,用于实现并包含对象。当您绑定 时,您看到的数据来自其 ,这就是您可以对绑定数据进行过滤和排序的方式。IList
IListSource
IListSource
GetList
IList
IList
IListSource
GetList
IList
DataTable
IListSource
GetList
DefaultView
DataView
IList
DataRowView
DataTable
DefaultView
评论
combo_company.Items.Add(...)
DataTable
SelectionChangeCommitted
SelectedItem
null
da
cmd
con
SelectedIndexChanged
Dim companyName As String = "" : If combo_company.SelectedIndex >= 0 Then companyName = DirectCast(combo_company.SelectedItem, DataRowView)(combo_company.DisplayMember).ToString()