c# - 表单完全可见后如何正确加载 DataGridView?

标签 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

如何解决这个问题?

最佳答案

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

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 线程上从数据库中获取所有数据,这就是您的表单不会重新绘制的原因。

为了解决此问题:

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

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

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

关于c# - 表单完全可见后如何正确加载 DataGridView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25658405/

相关文章:

c# - Entity Framework 和存储库模式(IQueryable 的问题)

c# - 如何测试阻塞功能?

c++ - 用VS2008编译的C++应用程序在其他电脑上运行不起来

visual-studio - Visual Studio 2015 远程调试器调试器成员或监视表达式均不返回值

c# - 取回匿名类型

c# - 如何通过 c# 更新 AD 用户的全名(不是显示名称)

mysql - 将多行写入 Lua 中的文件

PHP 和 MySQL 删除数据库中不应删除的字段

Mysql只记录一个数据库的日志

visual-studio - 手动安装VS IDE扩展? (GhostDoc 扩展)