Vb.net 尝试将行添加到现有数据表和网格视图时出错

Vb.net 尝试将行添加到现有数据表和网格视图时出错,vb.net,datagridview,visual-studio-2017,Vb.net,Datagridview,Visual Studio 2017,我目前有一个gridview,可以用查询填充它。单击按钮后,我希望使用新值再次运行查询,并将新信息添加到gridview中已经显示的内容中。我试图通过将gridview中当前的信息复制到datatable中,然后向表中添加一行,然后重置gridview上的绑定并刷新gridview来实现这一点。问题是我在尝试添加新行System.Data.NoNullAllowedException时出错:“ColumnName”不允许空值 下面是我尝试用于此过程的代码。任何帮助都将不胜感激 Dim Epico

我目前有一个gridview,可以用查询填充它。单击按钮后,我希望使用新值再次运行查询,并将新信息添加到gridview中已经显示的内容中。我试图通过将gridview中当前的信息复制到datatable中,然后向表中添加一行,然后重置gridview上的绑定并刷新gridview来实现这一点。问题是我在尝试添加新行System.Data.NoNullAllowedException时出错:“ColumnName”不允许空值

下面是我尝试用于此过程的代码。任何帮助都将不胜感激

Dim EpicorCM As New SqlCommand(JobSelect, EpicorCon)
            EpicorCon.Open()
            Dim EpicorReader As SqlDataReader = EpicorCM.ExecuteReader
            Dim JobInfoTable As New DataTable
            JobInfoTable = CType(dgvJobInfo.DataSource, DataTable).Copy
            JobInfoTable.Rows.Add(EpicorReader)
            dgvJobInfo.AutoGenerateColumns = True
            dgvJobInfo.DataSource = JobInfoTable
            dgvJobInfo.Refresh()
            EpicorCon.Close()
您正试图将SqlDataReader添加到Rows集合中,但这将不起作用。它只会编译,因为Add方法有一个重载,该重载是Object的params

幸运的是,DataTable有一个加载读取器的方法。请执行以下操作,而不是:JobInfoTable.Rows.AddEpicorReader:

JobInfoTable.Load(EpicorReader)

另外,命令和读卡器是一次性资源,因此您可以通过不在使用块或Finally块中处理它们来泄漏内存。

谢谢,这非常有效。出于某种原因,我认为使用.Load方法会覆盖表中已有的信息。