【问题标题】:Reusing a Datatable or am I going about this the wrong way...: DataTable already belongs to another DataSet重用数据表还是我走错了路……:数据表已经属于另一个数据集
【发布时间】:2018-08-13 08:23:23
【问题描述】:

VB.NET: 我一直将绑定源与数据集一起使用,并使用填充命令,然后填充网格等 - 没问题,但由于我工作的性质,我不得不使用编程编码的数据集,因为操作需要在幕后进行为我受雇的公司工作。

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

     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”并调用刷新列表子我得到异常:

"DataTable 已经属于另一个 DataSet。"

如您所见,从注释行中,我尝试在重新添加之前删除表格,但没有运气。

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

任何帮助将不胜感激,感谢您的宝贵时间!

【问题讨论】:

  • 清除 DataTable 中的行会作用于 Rows 集合,并且不会更改 Datatable 本身。严格来说,您根本不需要 DataSet,尤其是在只有一个 DT 的情况下。同一个 DT(和/或 DS)可以是多个控件的数据源。您还可以使用 DataViews 来区分
  • 只是不要以这种方式重复使用它。如果您需要在其他地方访问它,请使其可访问,如果您需要类似的表,请创建一个新表。

标签: vb.net datatable bind programmatically


【解决方案1】:

在尝试了各种交换和重置并且天知道是什么之后,我最终回顾了我是如何将数据表绑定到数据网格的,它像湿鱼一样打在脸上。

删除这批:

            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

任务完成。我现在要睡觉了,腌鱼脸疼。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢史蒂夫,我会试试你的代码,看看它是否有效 - 我很感激你的时间,你也可以用湿腌鱼打我,哈哈,我已经完成了我的一侧面对,这样你就可以在另一边猛击。再次感谢:) - 编辑:我可以确认你的代码也有效!所以我想知道什么是最好的方法 - 删除它并重新添加它或只是重新绑定它 - 我将运行一些测试(内存以及是否有任何泄漏) - 欢呼史蒂夫,卡尔。
    猜你喜欢
    • 2014-02-21
    • 1970-01-01
    • 2016-09-08
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2017-02-24
    相关资源
    最近更新 更多