【问题标题】:Most efficient way to bind DataRowView[] to DataGridView in C#在 C# 中将 DataRowView[] 绑定到 DataGridView 的最有效方法
【发布时间】:2018-03-02 14:56:06
【问题描述】:

我在 DataTable 上有一个 DataView(带有排序列,没有 RowFilter)。当我调用DataView.FindRows(SortCols[]) 时,它返回DataRowView[]

将此数组绑定到 DataGridView 的最有效方法是什么(就速度而言)?

我的谷歌搜索只返回了几个相关的结果,他们似乎建议遍历数组并将数据添加到新的 DataTable,然后可以绑定。

我希望我的 DataRowView[] 至少包含几百个项目,所以我不想采用迭代方式,除非没有更好的可用。

任何建议将不胜感激。非常感谢。

【问题讨论】:

  • 我通常执行以下操作:datagridview1.DataSource = dt;或者如果 fileter create new DataTable dt1 = dt.AsEnumerable().Where(x => x.Field("Col_A") == "ABC").CopyToDataTable();
  • 这对我来说不好。
  • 使用 AsEnumerable() 非常快,可以测试一下性能。缓慢的部分是刷新 DGV 控制。您必须小心确保只刷新 DGV 一次。
  • 我明白你在说什么。但我使用 DataView 的原因是它是在 DataTable 的多个列上创建索引的唯一方法,然后 FindRows() 有效地利用了相应的索引。我想坚持这一点,而不是使用 Linq。我面临的唯一困难是 FindRows 返回一个 DataRowView 数组,它不能直接绑定到 DataGridView,因此这个问题。
  • 您可以随时向 DataTable 添加新列并添加索引号。按照您的方式,您仍然必须将行数组放入数据表中。

标签: c# .net-3.5


【解决方案1】:

经过一些试验和错误,我最终得到了这个解决方案。我确实对数组进行了迭代,但可以避免对列进行二级迭代:

DataRowView[] drvFiltered = NFM.dtvFilterRothAppMsgs.FindRows(new string[] { sSenderCompId, sTargetCompId });

//-- Current solution
DataRow dr;
foreach (DataRowView drv in drvFiltered) {
    dr = dtbFilteredAppMsgs.NewRow();
    dr.ItemArray = drv.Row.ItemArray;
    dtbFilteredAppMsgs.Rows.Add(dr);
}
dtbFilteredAppMsgs.AcceptChanges();

目前有效。如果有人知道更直接的方法,请告诉我。非常感谢。

【讨论】:

    猜你喜欢
    • 2012-04-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2012-10-03
    • 2021-11-04
    • 2011-02-13
    相关资源
    最近更新 更多