如何跨应用程序在多个 Datagridviews 之间共享 DataTable 并节省宝贵的内存
Posted
技术标签:
【中文标题】如何跨应用程序在多个 Datagridviews 之间共享 DataTable 并节省宝贵的内存【英文标题】:How to share DataTable between multiple Datagridviews across Application and save precious memory 【发布时间】:2011-06-29 11:28:34 【问题描述】:我有一个 DataTable 格式的公司列表,它是静态的,可以在我的应用程序中访问。
应用程序中的不同表单仅在 DataGridView 中显示过滤后的数据,例如客户公司、供应商公司、杂项等。
DataGridViews 只是为了显示数据。
如果我只为客户公司查询我的公司 DataTable 并将结果分配给 DatagridView.Datasource,它只会制作一个副本并将其分配给 DataGridView。
想象一下,如果我有一个包含 10,000 个客户的列表,并且用户出于不同目的打开 10 个表单,我将只复制 10,000 * 10 行数据。 此外,如果我的主要 Companies DataTable 已更新,我也必须更新所有 DataGridViews。
使用 DataViews 会帮助我节省内存吗? BindingDatasource 会好吗? 或者有没有更好的方法来共享 DataTable 而无需在内存中复制仅用于显示目的。
问候
【问题讨论】:
[filter] ... 客户公司并将 ... 分配给 DatagridView.Datasource,它只会制作一个副本并将其分配给 DataGridView。 ...我没有不相信这是准确的。为 DataSource 复制 DataTable 是没有意义的 - 不是自动的。 这就是我想的......虽然我不清楚 【参考方案1】:给定:
我有一份公司名单 静态数据表格式 在我的应用程序中访问
我假设 1 DataTable
。你应该使用RowFilter
see MSDN: RowFilter:
DataGridView customerView;
DataGridView supplierView; // initialize in form
DataTable companiesTable; // initialized and filled
void SetCustomerCompanyView()
DataView cust = new DataView();
cust.Table = companiesTable;
cust.RowFilter = "Type = 'Customer'";
customerView.DataSource = cust;
// repeat for SetSupplierCompanyView()
如果担心要在多个活动视图中复制一个大型 DataTable,那么您真的应该重新考虑架构。如果表单被隐藏或不活动,您可以随时处理查询结果(在最坏的情况下)并重新查询表单是否/何时再次可见或活动(例如选项卡式表单)。对于它的价值,10k 记录在大多数系统中很容易处理,并且应该容纳该 DataTable 的几个打开视图(如上过滤)。
一个过于简单化的比较:
您可以将 DataView 视为List<int>
,其中int
将是行索引。当您应用行过滤器时,适当的行索引将附加到列表中。您可以使用 LINQ to DataSets 轻松创建视图 - 根据一列或多列数据提取所需的行索引并附加到列表中。现在,您可以使用该列表仅从您的主 DataTable 中引用您感兴趣的行(Table.Rows[RowIndex]
)。如上所述,这比 DataView
的功能要简单得多实际上提供了。您还没有复制 DataTable - 您只是创建了一个浅层引用机制。
【讨论】:
这正是我在谷歌搜索、创建 DataView 并将其分配给 DGV 时得到的,只是想确定是否有更好的方法 我还没有找到您实际创建副本的任何地方...我怀疑 DataView 只是引用.Table
以提供 DataRow 引用的集合。 DataViews 不是 DataTables 的副本。
如果是这样,那么感谢@IAbstract。我会轻松地使用 DataView以上是关于如何跨应用程序在多个 Datagridviews 之间共享 DataTable 并节省宝贵的内存的主要内容,如果未能解决你的问题,请参考以下文章
C# 相同的数据源 + 多个 DataGridViews = 数据绑定问题?
如何让 viewForZoomingInScrollView 在 Xcode 中跨多个 UIViewControllers 工作?