如何在表单完全可见后正确加载DataGridView?

时间:2014-09-04 06:13:54

标签: c# mysql visual-studio

我有2个表格。在表单一中,我输入信息,第二个作为帮助程序来获取第一个的代码(使用ShowDialog()方法)。由于以第二种形式检索的信息来自远程访问的数据库,有时需要几秒钟,所以我所做的是将加载信息的冗长方法移动到DataGridView到BackgroundWorker,代码在DoWork中是:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    this.Invoke((MethodInvoker)delegate
    {
    //Method to retrieve records
    });                             

}

并以表单的Shown()方法启动它。现在,我的问题是,第一次创建表单的一个实例时,它工作得很完美,但从第一次开始就显示出来了:

enter image description here

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

首先阅读有关您使用的类型的文档:

  

您必须小心不要操作DoWork事件处理程序中的任何用户界面对象。而是通过ProgressChanged和RunWorkerCompleted事件与用户界面进行通信。 Source

由于this.Invoke(...你基本上是在UI线程上从数据库中获取所有内容,这就是你的表单没有被重绘的原因。

为了解决这个问题:

  1. this.Invoke事件处理程序中删除DoWork以及访问UI控件的任何其他代码。在该处理程序中,您只想从数据库中获取记录,而不是更新任何UI。

  2. 将您的UI更新代码移至RunWorkerCompleted事件处理程序。

  3. 最后但并非最不重要的一点是,您可能希望不是在表单的Shown事件上开始加载数据,而是Form.Load,因为it precedes the Shown并且在表单之前引发显示。