如何跨应用程序在多个 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。你应该使用RowFiltersee 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 工作?

如何防止方法跨多个线程运行?

如何使用 Spring Security 跨多个基于 JVM 的应用程序实现单点登录

如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID