错误:System.NullReferenceException combo_company。SelectedIndexChanged 事件

Error: System.NullReferenceException at combo_company.SelectedIndexChanged event

提问人:Umesh 提问时间:7/10/2022 更新时间:7/10/2022 访问量:54

问:

VS 2012、VB.net、Winforms(桌面应用程序)
当我更改组合框(combo_company的项目时。SelectedIndexChanged 事件),我收到错误 System.NullReferenceException。
我试图获得combo_company的价值。SelectedItemcombo_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= 输出正常

vb.net visual-studio-2012 组合框

评论

2赞 dr.null 7/10/2022
1)忘记,你有一个,然后用它作为cbox的数据源。2)改为处理以获取和避免检查。3) 您应该处理一次性物品。, , , ...等。combo_company.Items.Add(...)DataTableSelectionChangeCommittedSelectedItemnulldacmdcon
1赞 dr.null 7/10/2022
提示:在 中,要得到公司:。SelectedIndexChangedDim companyName As String = "" : If combo_company.SelectedIndex >= 0 Then companyName = DirectCast(combo_company.SelectedItem, DataRowView)(combo_company.DisplayMember).ToString()
0赞 Umesh 7/10/2022
@dr.null 你的小费给了我想要的东西。

答:

1赞 user18387401 7/10/2022 #1

您的案例 2 是您应该做的,它完全按照应有的方式工作。当您将 绑定到 WinForms 控件时,数据实际上来自其 ,这是一个 .a 中的每个项目都是 ,因此绑定控件的 将是 ,这正是您所看到的。DataTableDefaultViewDataViewDataViewDataRowViewSelectedItemDataRowView

你说你想要,但我认为事实并非如此,因为这是整行。我怀疑您真正想要的是该行的值,即 .要获得该属性,请使用 .将为您提供 中指定的列中的值,而 将为您提供 中指定的列的值(作为 )。SelectedItemSelectedItemcompany_nameComboBoxTextComboBoxSelectedValueValueMemberTextStringDisplayMember

为了详细说明第一段,WinForms 中的复杂数据绑定需要一个实现接口或接口的对象。该接口有一个方法: ,它返回一个 .如果绑定一个,则使用其项目。如果绑定一个,则调用其方法并使用返回的项。该类实现接口,其方法返回其属性值,该值是一个 ,用于实现并包含对象。当您绑定 时,您看到的数据来自其 ,这就是您可以对绑定数据进行过滤和排序的方式。IListIListSourceIListSourceGetListIListIListIListSourceGetListIListDataTableIListSourceGetListDefaultViewDataViewIListDataRowViewDataTableDefaultView

评论

0赞 Umesh 7/10/2022
selectedItem.tostring 在案例 1 中获取输出,但在案例 2 中未获取输出。在案例 2 中,selectedText.toString 为空。我只想显示所选项目的名称(abc、def、ghi)及其值(id)以进一步处理。