我终于开始学习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时,如果我在Binding源在网格中显示其数据时清除/清空它,我会得到如果我尝试访问其中一个BindingSource的DataRowView对象的DataRow,则为null异常。
我似乎无法在此找到明确的答案(请随时指出我在某处详细解释这一点),但以下似乎是这样的:
或者,换句话说,如果需要,BindingSource将引入并保持其基础数据持久(例如,底层对象被销毁/处置/超出范围)。
是?没有?就像我说的那样,我很感激有人,教我如何捕鱼"在这个问题上,我还没有找到关于它的讨论(或者不知道在哪里可以更深入地阅读它)。
答案 0 :(得分:1)
DataSource
持有与dtInv
相同的对象的引用,因此即使变量 dtInv
超出范围,它引用的对象将不会被GC控制,因为DataSource
仍然有对它的引用(当然,当DataSource
超出范围时,假设没有其他引用它,然后它将成为GC符合条件)。所以对象基本上是活着的。 DataSource
不会克隆或复制您拥有的对象。
作为“最佳实践”,人们通常会让BindingSource或DataGridView保持数据持久性,或者将底层DataTable变量作为表单类级别数据成员或属性保留在范围内更好吗?
我认为“持久性”是指在内存中保持活力而不是人们通常所说的“持久性”数据(通常意味着将其保存在某个地方,如文件或数据库)。这里被认为是“最好的”取决于您对数据的处理以及是否需要再次访问它。如果您只是抓取一堆数据并将其只读放入数据网格中,那么只需设置DataSource
并将其留在那里就没有错。如果你确实需要仍然能够访问该对象并使用它(例如,在编辑后将其保存回数据库),我可能会将其保存为类型化的类变量,如果没有其他原因而不是类型DataSource
的{{1}}是object
,当你想要使用它时,你必须继续将其重新投射到它的实际位置。