Vb.net 重复使用一个数据表,还是我的做法不对…:数据表已经属于另一个数据集

Vb.net 重复使用一个数据表,还是我的做法不对…:数据表已经属于另一个数据集,vb.net,datatable,bind,programmatically,Vb.net,Datatable,Bind,Programmatically,VB.NET: 我一直使用bindingsource的数据集,使用fill命令,然后填充网格等-没问题,但我不得不使用编程编码的数据集,因为我为我所雇用的公司工作的性质,需要在幕后进行操作 因此,我的代码如下所示: 在表单中,我在顶部声明(因为我需要从表单的其他部分访问它) Dim Facility_Table As DataTable 然后,在我的load sub中,我调用一个sub(我将减少所有内容,使其尽可能短) 然后调用另一个子系统(refreshlist),该子系统从SQL

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

因此,我的代码如下所示: 在表单中,我在顶部声明(因为我需要从表单的其他部分访问它)

     Dim Facility_Table As DataTable
然后,在我的load sub中,我调用一个sub(我将减少所有内容,使其尽可能短)

然后调用另一个子系统(refreshlist),该子系统从SQLServer获取一些数据,并将其放入新行中的字段中

    'Facility_Table.Reset()
    Facility_Table.Clear()
    Facility_Table.NewRow()
    Facility_Table.Rows.Add(.Rows(Z).Item("Level1").ToString,
                            .Rows(Z).Item("Level2").ToString)
然后我调用了refreshsource sub:-现在我通常会这样做,不同于将网格绑定到数据源而不是我的代码,这是我在互联网上通过谷歌搜索来处理我的数据表的东西

    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已属于另一个数据集。”

如您所见,在注释行中,我尝试在重新添加表之前删除它,但没有成功

我认为只需要清除数据表,然后重新填充它并重新绑定它就可以了,但我有一种感觉,我错过了某个地方的一个步骤,我希望它只是一行代码,或者最坏的情况下只是几行额外的代码


非常感谢您的帮助!

发生此错误是因为DataTable“记住”了它所属的数据集。此关联是在您将表添加到dataset tables属性时建立的。因此,如果您确实希望保留相同的DataTable,并且要将其添加到另一个数据集,则首先需要o从上一个数据集中删除该表

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

在尝试了各种交换和重置之后,天知道发生了什么,我最后回顾了我如何将数据表绑定到数据网格,结果它像一个湿漉漉的kipper一样打了我一耳光

删除此批次:

            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

工作完成了。我现在要睡觉了,kipper的脸很痛。

清除数据表中的行的可能重复作用于行集合,不会改变数据表本身。严格来说,你根本不需要数据集,特别是当只有一个DT时。相同的DT(和/或DS)可以是多个控件的数据源。您也可以使用DataView进行区分,但不要以这种方式重复使用它。如果您需要在其他地方访问它,请使其可访问,如果您需要类似的表,请创建一个新的表。谢谢Steve,我将试用您的代码,看看是否有效-我感谢您的时间,您可以用湿kippe打我一巴掌r太lol了,我已经做了我脸的一边,所以你可以在另一边猛击。再次感谢:)-编辑:我可以确认你的代码也可以!所以我想知道什么是最好的方法-删除它并重新添加它或只是重新绑定它-我将运行一些测试(内存,如果有任何泄漏)-史蒂夫,卡尔干杯。
    DataGridView2.DataSource = Facility_Table