首先,有问题的代码:
public virtual void grid_RefreshFetchData(Object sender, RefreshEventArgs e)
{
C1DBGrid g = (C1DBGrid)sender;
if (g.RefreshUseResult)
{
DataTable dtNew = FetchRawData(e.Argument);
dt_Patch(dtNew, e.Argument);
g.BindingSource.SuspendBinding();
((DataTable)g.BindingSource.DataSource).Clear();
((DataTable)g.BindingSource.DataSource).Merge(dtNew);
g.BindingSource.ResumeBinding();
}
}
您看到的是一个事件处理程序,该处理程序是从最终启动的后台线程调用的,因为 Windows 窗体需要数据。网格对象(它是一个 ComponentOne TrueDBGrid)由该表单拥有,并且我们设置了事件以允许表单告诉网格请求新数据。该调用导致此处理程序,其目的是请求底层数据类获取包含记录的 DataTable,然后将该表与网格的 BindingSource(它是相同模式的 DataTable)合并。
我的问题:当调用 Merge() 方法将新数据合并到网格的(新清空的)BindingSource(同样是 DataTable 本身)中时,会引发大量异常。每个异常实例实际上是三个异常:一个 System.Reflection.TargetInvocationException 后跟一对 System.InvalidOperationExceptions。这导致性能非常差,这是我必须纠正的。
我明白发生了什么。在表单上,我们使用控件的 Text 属性将 TextBox 控件绑定到网格的 BindingSource。每次将行合并到 BindingSource 时都会触发此绑定。最后一部分没有被观察到,这有点猜测,但绝对数量的异常表明这是正确的假设。那,以及当我注释掉所有绑定时,性能显着提高的事实。
所以我要求的是帮助理解我如何暂停这个绑定触发器。如您所见,我在事件处理程序中有几行试图在 BindingSource 上挂起它。
我也已经尝试过了:
g.SuspendBinding();
它没有任何区别。事实上,我已经尝试在等式的两端暂停绑定,在表单和线程刷新中,但总是所有尝试都没有结果。
你能帮我吗?