【发布时间】: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