You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中BindingSource转DataGridView时ComboBox空引用错误解决

解决BindingSource复用导致的DataGridView添加数据空引用错误

问题根源

第二种代码中,类级别的bindingSource被同时用来绑定DataGridView的People列表和ComboBox的Job1列表。当用户触发ComboBox的DropDown或KeyDown事件时,BindcomboboxJob1方法会将bindingSource重新赋值为绑定Job1数据的实例,覆盖了原本指向DataGridView数据源的引用。此时点击添加按钮,TryCast(bindingSource.DataSource, BindingList(Of People))会返回Nothing,调用bs.Add就会抛出“对象引用未设置到对象实例”的错误。

解决方案

为ComboBox单独分配一个BindingSource,避免复用DataGridView的绑定变量,确保两个数据源的引用互不干扰。

修改后的完整代码

Public Class Form2
    ' 分别声明两个BindingSource,分开管理DataGridView和ComboBox的数据源
    Private peopleBindingSource As BindingSource = Nothing
    Private jobBindingSource As BindingSource = Nothing

    Public Sub New()
        InitializeComponent()
        ComboBox1.DropDownHeight = 80
        ComboBox1.Text = "Job1"
    End Sub

    Public Sub New(Transno As People)
        Me.New()
        ' 初始化DataGridView的绑定源
        peopleBindingSource = New BindingSource With {.DataSource = New BindingList(Of People)(CType(pservice.GetPeopleview(Transno.Transno), IList(Of People)))}
        DataGridView1.DataSource = peopleBindingSource
    End Sub

    Private Sub BtnAdd_Click(sender As Object, e As EventArgs) Handles BtnAdd.Click
        Dim job1 = ComboBox1.Text.Trim()
        Try
            Dim new_product = New People With {
                .Transno = TextBox1.Text,
                .Username = TextBox2.Text,
                .Job1 = job1
            }
            ' 使用DataGridView专属的绑定源
            Dim bs = TryCast(peopleBindingSource.DataSource, BindingList(Of People))
            ' 增加空引用判断,避免异常
            If bs IsNot Nothing Then
                bs.Add(new_product)
            Else
                MessageBox.Show("数据源未初始化")
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub BindcomboboxJob1()
        If ComboBox1.DataSource IsNot Nothing Then Return
        Cursor.Current = Cursors.WaitCursor
        ComboBox1.DisplayMember = "Job1"
        ComboBox1.ValueMember = "Job1"
        ' 初始化ComboBox专属的绑定源
        jobBindingSource = New BindingSource With {.DataSource = New BindingList(Of Job1)(CType(pservice.GetByJob1, IList(Of Job1)))}
        ComboBox1.DataSource = jobBindingSource
        Cursor.Current = Cursors.Default
    End Sub

    Private Sub ComboBox1_DropDown(sender As Object, e As EventArgs) Handles ComboBox1.DropDown
        BindcomboboxJob1()
    End Sub

    Private Sub ComboBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles ComboBox1.KeyDown
        BindcomboboxJob1()
    End Sub
End Class

关键修改点

  1. 新增jobBindingSource专门用于ComboBox的数据绑定,不再复用peopleBindingSource
  2. 所有涉及DataGridView数据源的操作都使用peopleBindingSource,ComboBox相关操作使用jobBindingSource
  3. 在添加数据时增加bs IsNot Nothing的判断,进一步避免空引用异常

内容的提问来源于stack exchange,提问作者user22579796

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:31:14