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

时间:2011-06-29 11:28:34

标签: c# datagridview datatable

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

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

DataGridViews只是为了显示数据。

如果我只为客户公司查询我的公司DataTable并将结果分配给DatagridView.Datasource,它只会复制并为其分配DataGridView。

想象一下,如果我有一个10,000个客户列表和用户打开10个表单用于不同目的,我将只复制10,000 * 10行数据。 此外,如果我的主要公司DataTable已更新,我将不得不更新所有DataGridViews。

使用DataViews会帮我节省内存吗? BindingDatasource会好吗? 或者有没有更好的方法来共享DataTable而不在内存中复制只是为了显示目的。

此致

1 个答案:

答案 0 :(得分:2)

假设:

  

我有一份公司名单   DataTable格式是静态的   可通过我的应用程序访问

我假设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将是行索引。应用行筛选器时,相应的行索引将附加到List。您可以使用LINQ to DataSet轻松创建视图 - 根据一列或多列数据提取所需的行索引并附加到List。现在,您使用该列表引用您对主DataTable感兴趣的行(仅Table.Rows[RowIndex] 如上所述,这比{更简单的功能{1}} 实际提供。您还没有制作DataTable的副本 - 您只是创建了一个浅层参考机制。