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
关键修改点
- 新增
jobBindingSource专门用于ComboBox的数据绑定,不再复用peopleBindingSource - 所有涉及DataGridView数据源的操作都使用
peopleBindingSource,ComboBox相关操作使用jobBindingSource - 在添加数据时增加
bs IsNot Nothing的判断,进一步避免空引用异常
内容的提问来源于stack exchange,提问作者user22579796
相关产品推荐
相关产品推荐

