我有一个DataTable格式的公司列表,它是静态的,可以通过我的应用程序访问。
应用程序中的不同表单只是在DataGridView中显示过滤数据,如客户公司,供应商公司,杂项等。
DataGridViews只是为了显示数据。
如果我只为客户公司查询我的公司DataTable并将结果分配给DatagridView.Datasource,它只会复制并为其分配DataGridView。
想象一下,如果我有一个10,000个客户列表和用户打开10个表单用于不同目的,我将只复制10,000 * 10行数据。 此外,如果我的主要公司DataTable已更新,我将不得不更新所有DataGridViews。
使用DataViews会帮我节省内存吗? BindingDatasource会好吗? 或者有没有更好的方法来共享DataTable而不在内存中复制只是为了显示目的。
此致
答案 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的副本 - 您只是创建了一个浅层参考机制。