重用数据表或我是以错误的方式...:DataTable已经属于另一个DataSet

时间:2018-03-05 16:00:39

标签: vb.net datatable bind programmatically

VB.NET: 我总是使用bindingsource与数据集并使用fill命令,然后填充网格等 - 没问题,但我不得不使用编程编码的数据集作为操作需要在幕后继续,因为我正在工作的性质为我所雇用的公司工作。

所以,我的代码看起来像这样: 在表单中,我已在顶部声明(因为我需要从表单的其他部分访问它

     Dim Facility_Table As DataTable

然后在我的加载子中我调用一个子(我会把所有东西都缩小,以便它尽可能短)

    Private Sub CreateNewDataTable()

    Try
        Facility_Table.Clear()
        Facility_Table.Columns.Add("Level1", GetType(String))
        Facility_Table.Columns.Add("Level2", GetType(String))
    End Sub

然后调用另一个子(refreshlist)从SQL Server中获取一些数据并将其铲入新行的字段中。

    'Facility_Table.Reset()
    Facility_Table.Clear()
    Facility_Table.NewRow()
    Facility_Table.Rows.Add(.Rows(Z).Item("Level1").ToString,
                            .Rows(Z).Item("Level2").ToString)

然后我调用了一个refreshsource子: - 现在这一点我做的正常,不同于将网格绑定到数据源而不是我的代码,我通过谷歌搜索在互联网上提取的东西用于我的数据表。

    Dim Dset As New DataSet()

        ' Dset.Tables.Remove(Facility_Table)
        Dset = New DataSet()
        Dset.Tables.Add(Facility_Table)
            Dim bs As BindingSource
            bs = New BindingSource()

            bs.DataSource = Dset
            bs.DataMember = Dset.Tables(0).TableName
            DataGridView2.DataSource = Nothing
            DataGridView2.DataSource = bs
            DataGridView2.Refresh()

它第一次工作正常 - 然后如果我点击我的树视图去另一个“Level1”并调用refreshlist sub我得到例外:

“DataTable已经属于另一个DataSet。”

正如您所看到的,从注释行开始,我尝试在重新添加之前删除该表,但没有运气。

我认为只需清理数据表,然后重新填充数据并重新绑定它就可以了,但我觉得我错过了某个地方,我希望它只是一个单行程或者最糟糕的是只需要几行代码。

非常感谢任何帮助,谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

发生此错误是因为DataTable'记住'它所属的数据集。将表添加到DataSet表属性时,将构建此关联。因此,如果您真的想要保持相同的DataTable并且想要将其添加到另一个DataSet,则首先需要从先前的DataSet中删除该表。

Dset = New DataSet()
Facility_Table.DataSet?.Tables.Remove(Facility_Table)
Dset.Tables.Add(Facility_Table)

答案 1 :(得分:0)

在尝试了各种交换和重置之后,上帝知道了什么,我最后回头看看我如何将数据表绑定到数据网格中,它像湿腌鱼一样在脸上拍打。

删除此批次:

            Dim Dset As New DataSet()
            'Dset = New DataSet()
            Dset.Tables.Add(Facility_Table)
            Dim bs As BindingSource
            bs = New BindingSource()

            bs.DataSource = Dset
            bs.DataMember = Dset.Tables(0).TableName
            DataGridView2.DataSource = Nothing
            DataGridView2.DataSource = bs
            DataGridView2.Refresh()

并将其替换为:

    DataGridView2.DataSource = Facility_Table

工作完成了。我现在要去睡觉了,脸上的k k。。