我有 2 个表格。在第一个表单中,我输入信息,第二个表单作为帮助程序来获取第一个表单的代码(与 ShowDialog() 方法一起使用)。由于在第二种形式中检索到的信息来自远程访问的数据库,有时需要几秒钟的时间,所以我所做的是将信息加载到 DataGridView 中的冗长方法移动到BackgroundWorker ,DoWork中的代码为:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
this.Invoke((MethodInvoker)delegate
{
//Method to retrieve records
});
}
并在表单的 Shown()
方法中启动它。现在,我的问题是,第一次创建表单实例时它工作得很好,但从第一次开始它就显示如下:
如何解决这个问题?
最佳答案
首先阅读有关您使用的类型的文档:
You must be careful not to manipulate any user-interface objects in your DoWork event handler. Instead, communicate to the user interface through the ProgressChanged and RunWorkerCompleted events.Source
由于 this.Invoke(...
,您基本上是在 UI 线程上从数据库中获取所有数据,这就是您的表单不会重新绘制的原因。
为了解决此问题:
从
DoWork
事件处理程序中删除this.Invoke
以及访问 UI 控件的任何其他代码。在该处理程序中,您只想从数据库中获取记录,而不更新任何 UI。将您的 UI 更新代码移至
RunWorkerCompleted
事件处理程序。最后但并非最不重要的一点是,您可能不希望在表单的
Shown
事件上开始加载数据,而是在Form.Load
上开始加载数据。 ,因为it precedes theShown
并在表单显示之前引发。
关于c# - 表单完全可见后如何正确加载 DataGridView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25658405/