2014-09-04 30 views
0

我有2种形式。在表单一中,我输入信息,第二个作为帮助程序获取第一个代码(使用ShowDialog()方法)。由于以第二种形式检索到的信息来自正在远程访问的数据库,因此有时需要几秒钟,所以我所做的就是将用于将信息加载到DataGridView的冗长方法移至BackgroundWorker,DoWork中的代码是:如何在窗体完全可见后正确加载DataGridView?

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

} 

并在窗体的Shown()方法中启动它。现在,我的问题是,在第一时间形式的实例被创建它的作品完美,但在第一次它显示是这样的:

enter image description here

我怎样才能解决这个问题?

+0

隐藏gridview,直到数据加载完毕,然后您已将数据源分配给它,然后使其可见。 – Mairaj 2014-09-04 06:25:10

+0

它仍然和屏幕截图中显示的一样。 – Hikaros 2014-09-04 06:38:22

回答

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并显示表单之前上升。

+0

哦,我甚至都不知道我在DoWork中无法做UI。我在这里看到有人在这里搜索这样的问题,所以我认为它是正确的x_x。我做了你所说的并且它完美地解决了这个问题,谢谢。 – Hikaros 2014-09-04 07:29:10

相关问题