加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 优化DataTable绑定到DataGridView的更新

发布时间:2020-12-15 03:58:27 所属栏目:百科 来源:网络整理
导读:我的应用程序中有一个表单显示一些数据.当我第一次显示Form时,我将一些数据加载到DataTable中,然后将DataTable绑定到DataGridView.我还启动一个异步方法来执行一些较慢的数据库查询.当这些慢速查询完成后,我需要在DataTable中更新几百行,填写慢速查询返回的
我的应用程序中有一个表单显示一些数据.当我第一次显示Form时,我将一些数据加载到DataTable中,然后将DataTable绑定到DataGridView.我还启动一个异步方法来执行一些较慢的数据库查询.当这些慢速查询完成后,我需要在DataTable中更新几百行,填写慢速查询返回的值,如下所示:
foreach (DataRow row in data.Rows)
{
    SlowLoadingData slow_stuff = slow_query_results[(int)row["id"]];

    row.BeginEdit();
    row[column_one] = slow_stuff.One;
    row[column_two] = slow_stuff.Two;
    row[column_three] = slow_stuff.Three;
    row.EndEdit();
}

这是非常慢的,挂起UI线程一分钟或更多,大概是因为每一行都触发重绘.

经过一番研究,我找到了一种方法,使其快速.首先,将DataGridView绑定到绑定到DataTable的绑定源,而不是直接到DataTable.然后,当您更改DataTable时,请执行以下操作:

binding_source.SuspendBinding();
binding_source.RaiseListChangedEvents = false;
// foreach (DataRow in Data.Rows) ... code above
binding_source.RaiseListChangedEvents = true;
binding_source.ResumeBinding();
grid.Refresh();

有一个问题,但它是一个doozy:上面的代码阻止DataGridView检测添加到DataTable的新行.添加到表格中的任何新行都不会出现在网格中.如果使用箭头键将当前单元格选择移动到网格的底端,则网格也可能会抛出异常,因为底层数据源具有更多行,但网格尚未创建网格行来显示它们.

所以,我可以看到两个可能的解决方案:

>在更改底层DataTable时,是否有更好的方法来抑制绑定更新?
>有没有一个简单的方法来告诉DataGridView来优雅地刷新其网格行集合以匹配底层DataTable行的数量? (注意:我已经尝试调用BindingSource.ResetBindings,但如果从DataTable中删除了行,似乎会触发更多的异常!)

解决方法

您是否考虑在填写表并重新连接时断开dataGrid或bindingSource的连接?它可能看起来有点丑陋,但它应该要快很多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读