BindingSource 对象是否复制 DataSource 数据?

Does a BindingSource object duplicate DataSource data?

我终于开始学习 BindingSource 对象了——好东西。所以,这种类型的代码是现在加载 DataGridView 的常用方法:

    DataTable dtInv = new DataTable();
    // Do whatever populates dtinv...
    bsData.DataSource = null;
    bsData.DataSource = dtInv;
    dgv.DataSource = bsData;

工作正常,我能够访问 BindingSource 的 DataRowViews 以及底层的 DataRows。酷

不过,我想知道底层 DataTable 对象的范围。我曾经将 dtInv 声明为表单级数据成员,所以我希望当 BindingSource 后面的数据被访问时一切正常其他方法。但即使底层 DataTable 仅对数据加载方法而言是本地的,它也能正常工作。

那么,BindingSource 对象是否克隆了整个 DataTable?如果我为 DataTable 使用表单级数据成员,BindingSource 是否会使用对它的引用而不是创建数据的单独副本?我想我已经测试过了,但我不确定结果......当我使用表单级数据表时,如果我 clear/null 它出来而绑定源在网格中显示它的数据,我会得到如果我尝试访问 BindingSource 的 DataRowView 对象之一下面的 DataRow,则会出现空异常。

我似乎找不到关于这个问题的明确答案(请随时指点我详细解释这个问题的地方),但情况似乎如下:

或者,换句话说,如果需要,BindingSource 将引入并保持其底层数据持久化(例如,底层对象 destroyed/disposed/goes 超出范围)。

是吗?不?就像我说的,我很感激有人 "teaching me how to fish" 在这方面,我只是没能找到关于它的讨论(或者不知道在哪里可以更深入地阅读它来找到一个)。

DataSource 持有与 dtInv 相同对象的引用,因此即使 变量 dtInv 超出范围,它引用的 object 将不会被 GC,因为 DataSource 仍然有对它的引用(当然,当 DataSource 退出作用域,并且假设没有其他东西引用它,那么它将成为符合 GC 条件的)。因此,该对象基本上保持活动状态。 DataSource 没有克隆或复制您拥有的对象。

As a "best practice", then, do folks usually let the BindingSource or DataGridView keep data persistent, or it is a better idea to keep the underlying DataTable variable in scope as a form class level data member or property?

我假设 "persistent" 是指在内存中保持活动状态,而不是人们通常所说的 "persistent" 数据(这通常意味着将其保存在某个地方,例如文件或数据库)。 "best" 这里的内容在很大程度上取决于您对数据的处理方式以及您是否需要再次访问它。如果您只是抓取一堆数据并将其 只读 放入数据网格,那么只需设置 DataSource 并保留它就没什么问题了。如果您仍然需要能够访问该对象并对其进行操作(例如,在编辑后将其保存回数据库),如果没有其他原因,我可能会将其保存为类型化 class 变量DataSource 的类型是 object 的原因,当你想使用它时,你必须不断地将它转换回它的真实状态。