我有2个表格。在表单一中,我输入信息,第二个作为帮助程序来获取第一个的代码(使用ShowDialog()方法)。由于以第二种形式检索的信息来自远程访问的数据库,有时需要几秒钟,所以我所做的是将加载信息的冗长方法移动到DataGridView
到BackgroundWorker,代码在DoWork中是:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
this.Invoke((MethodInvoker)delegate
{
//Method to retrieve records
});
}
并以表单的Shown()
方法启动它。现在,我的问题是,第一次创建表单的一个实例时,它工作得很完美,但从第一次开始就显示出来了:
如何解决此问题?
答案 0 :(得分:1)
首先阅读有关您使用的类型的文档:
您必须小心不要操作DoWork事件处理程序中的任何用户界面对象。而是通过ProgressChanged和RunWorkerCompleted事件与用户界面进行通信。 Source
由于this.Invoke(...
你基本上是在UI线程上从数据库中获取所有内容,这就是你的表单没有被重绘的原因。
为了解决这个问题:
从this.Invoke
事件处理程序中删除DoWork
以及访问UI控件的任何其他代码。在该处理程序中,您只想从数据库中获取记录,而不是更新任何UI。
将您的UI更新代码移至RunWorkerCompleted
事件处理程序。
最后但并非最不重要的一点是,您可能希望不是在表单的Shown
事件上开始加载数据,而是Form.Load
,因为it precedes the Shown
并且在表单之前引发显示。