C# 如何跨应用程序在多个DataGridView之间共享DataTable并节省宝贵的内存

C# 如何跨应用程序在多个DataGridView之间共享DataTable并节省宝贵的内存,c#,datagridview,datatable,C#,Datagridview,Datatable,我有一个DataTable格式的公司列表,它是静态的,可以通过我的应用程序访问 应用程序中的不同表单只是在DataGridView中显示过滤后的数据,如客户公司、供应商公司、杂项等 DataGridView只是为了显示数据 如果我只为客户公司查询我的公司数据表,并将结果分配给DatagridView.Datasource,它只会制作一个副本并将其分配给DatagridView 想象一下,如果我有一个10000个客户的列表,并且用户为不同的目的打开了10个表单,那么我只需要复制10000*10行数

我有一个DataTable格式的公司列表,它是静态的,可以通过我的应用程序访问

应用程序中的不同表单只是在DataGridView中显示过滤后的数据,如客户公司、供应商公司、杂项等

DataGridView只是为了显示数据

如果我只为客户公司查询我的公司数据表,并将结果分配给DatagridView.Datasource,它只会制作一个副本并将其分配给DatagridView

想象一下,如果我有一个10000个客户的列表,并且用户为不同的目的打开了10个表单,那么我只需要复制10000*10行数据。 另外,如果我的主公司数据表被更新,我也必须更新所有的DataGridView

使用数据视图是否有助于节省内存? BindingDatasource会有好处吗? 或者,有没有更好的方法来共享数据表,而不在内存中进行复制,仅用于显示目的

关于以下内容:

我有一份中国公司的名单 数据表格式,它是静态和 可通过我的应用程序访问

我假设1
DataTable
。您应该使用
RowFilter

如果担心一个大数据表将在多个活动视图中被复制,那么您真的应该重新考虑体系结构。如果表单处于隐藏状态或非活动状态,则始终可以处理查询结果(在最坏的情况下),并在表单再次变为可见或活动状态(例如选项卡式表单)时重新查询。值得一提的是,在大多数系统中,10k记录很容易处理,并且应该能够容纳该数据表的多个开放视图(如上所述进行过滤)

一个过于简单的比较:

您可以将数据视图视为一个
列表
,其中
int
将是一个行索引。应用行筛选器时,相应的行索引将附加到列表中。您可以使用LINQ to数据集轻松创建视图—根据一列或多列数据提取所需的行索引并附加到列表中。现在,您使用该列表仅引用主数据表中感兴趣的行(按
表。行[RowIndex]
)。如上所述,这比
数据视图
实际提供的功能简单得多。
您没有复制数据表-您只是创建了一个浅层引用机制。

[filter]。。。客户公司和分配。。。对于DatagridView.Datasource,它只需创建一个副本并将其分配给DatagridView。。。我不相信这是准确的。为数据源复制数据表是没有意义的——不是自动复制的。。。我不清楚这是否正是我在谷歌搜索、创建DataView并将其分配给DGV时得到的结果,我只是想确定是否还有更好的方法我在任何地方都没有找到您实际创建副本的方法……我怀疑DataView只是引用
.Table
来提供DataRow引用的集合。DataView不是DataTables的副本。如果是这样,请感谢@IAbstract。我将轻松地使用DataView
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()