【问题标题】:Does a BindingSource object duplicate DataSource data?BindingSource 对象是否重复 DataSource 数据?
【发布时间】:2016-03-31 20:39:45
【问题描述】:

我终于开始学习 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 是否会使用对它的引用而不是创建数据的单独副本?我想我已经测试过了,但不确定结果......当我使用表单级 DataTable 时,如果我在 Bindingource 在网格中显示其数据时将其清除/清空,我将得到一个空值如果我尝试访问 BindingSource 的 DataRowView 对象之一底层的 DataRow,则会出现异常。

我似乎无法找到明确的答案(请随时指出我详细解释此问题的地方),但情况似乎如下:

  • 如果 BindingSource 将其 DataSource 属性设置为一个对象 随后超出范围,BindingSource 保持 底层对象“活着”、可访问且完整。
  • 如果 BindingSource 将其 DataSource 属性设置为一个对象 仍然在范围内,只要可以,它就会一直指向它。

或者,换句话说,如果需要,BindingSource 将拉入并保持其底层数据持久化(例如,底层对象被销毁/处置/超出范围)。

是吗?不?就像我说的,我很感激有人在这个问题上“教我如何钓鱼”,我只是找不到关于它的讨论(或者不知道在哪里可以更深入地阅读它来找到一个) .

【问题讨论】:

  • 它持有对dtInv 的引用,因此即使变量 dtInv 超出范围,它也会使dtInv 保持活动状态。这不是什么魔法。这与将 dtInv 分配给类属性或字段完全相同。
  • 谢谢,马特!我想我没有完全理解引用的“保持活力”性质(嗯,除了自动化 Excel 实例时——我知道事情是如何保持“活力”的……)作为“最佳实践”,那么,人们通常让 BindingSource 或 DataGridView 保持数据持久化,还是将底层 DataTable 变量作为表单类级别的数据成员或属性保持在范围内是一个更好的主意? (顺便说一句,随时提交您的评论作为答案......)

标签: c# datagridview datatable scope bindingsource


【解决方案1】:

DataSource 持有与 dtInv 相同对象的引用,因此即使 变量 dtInv 超出范围,object它被引用不会被 GC 处理,因为 DataSource 仍然有对它的引用(当然,当 DataSource 超出范围,并且假设没有其他东西引用它,那么它将成为 GC 合格)。所以这个对象基本上是活着的。 DataSource 不会克隆或复制您拥有的对象。

那么,作为“最佳实践”,人们通常是让 BindingSource 或 DataGridView 保持数据持久性,还是将底层 DataTable 变量作为表单类级别的数据成员或属性保持在范围内是更好的主意?

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

【讨论】:

  • 马特,感谢您精彩而详细的回答。是的,我所说的“持久”是指在内存中,是的,我们需要将更新、插入和删除写回真正持久的(磁盘上)数据库。显然,这是 Entity Framework 之类的东西大放异彩的地方,但我们将通过 Foxpro OLEDB 数据提供程序来处理 Foxpro(DBF 文件)数据。虽然类很棒,但必须开发所有这些庞大的类来建模/呈现我们的数据,这有点糟糕。我知道这是“正确”的做法,但我们习惯于直接处理数据游标(DataTables,在 C# 的情况下)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多