【问题标题】:Set DataGridView.DataSource async设置 DataGridView.DataSource 异步
【发布时间】:2017-02-12 23:08:52
【问题描述】:

我必须说我已经阅读这个网站很长时间了,并且总能找到我想要的东西。遗憾的是,今天并非如此。

我有一个 .NET C# Winforms 应用程序,它使用 MySQL .NET 连接器来查询数据库并用结果填充 DataGridView。

这是我的代码:

using (var SqlConn = new MySqlConnection(MyConnectionString)
{
    using (var SqlComm = new MySqlCommand("SELECT * FROM my_database.city", SqlConn)
    {
        using (var SqlAdapter = new MySqlDataAdapter(SqlComm)
        {
            DataTable SqlOutput = new DataTable();
            SqlAdapter.Fill(SqlOutput);
            myDataGridView.DataSource = SqlOutput;
        }
    }
}

代码运行良好。问题是,考虑到表格有 20K 行,加载需要一些时间,同时它会阻塞 UI。

做了一些测试,我得出的结论是数据库查询 Fill() 非常快(实际上需要 10 毫秒)。 因此,设置 DataGridView.DataSource 属性会延迟整个操作

所以我的问题是,有没有办法将 DataSource 属性设置为异步?或者也许是我在加载数据时仍然可以使用表单的一种方式?

我还想知道是否有更好的方法来执行此操作,因为每次我对数据库表进行更改时都会调用此方法,以便向用户显示更新的信息。

提前致谢。

【问题讨论】:

  • 20K 行太多,无法在 DataGriView 中显示。最好用分页加载数据。此外,为了防止加载数据时 UI 冻结,请使用 async/await 或在与 UI 线程不同的线程中加载数据。 Example: Load data asynchronously into my DataTable in Windows Forms
  • @RezaAghaei 我确实有一个实现 MySqlDataAdapter.FillAsync 方法的 async/await 方法。但是从数据库中提取的数据实际上并没有冻结 UI,设置 DataSource 属性可以。而且我仍然会同步执行该步骤。你能告诉我更多关于通过分页加载它的信息吗?
  • 所以在virtual mode 中使用DataGridView 或分页加载数据。

标签: c# mysql winforms datagridview


【解决方案1】:

文档建议使用“virualmode”属性设置。

https://msdn.microsoft.com/en-us/library/15a31akc.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1

还有其他有趣的话题“及时加载”。 在 Windows 窗体 DataGridView 控件中使用实时数据加载实现虚拟模式

https://msdn.microsoft.com/en-us/library/ms171624(v=vs.110).aspx

您在上面的链接中有很好的例子。值得一看。

【讨论】:

    【解决方案2】:

    使用线程。以编程方式填充您的 DataGridView,而不是使用 DataSource。

     public void LoadDataGrid(DataTable d, DataGridView dg )
        {
    
            if (dg.InvokeRequired)
            {
                dg.BeginInvoke((MethodInvoker)delegate()
                {
                    dg.Rows.Clear();
                    dg.ColumnCount = 7;
                    dg.Columns[0].Name = "Order No.";
                    dg.Columns[0].Width = 110;
                    dg.Columns[1].Name = "Order Date";
                    dg.Columns[1].Width = 100;
                    dg.Columns[2].Name = "Excepted rcv date";
                    dg.Columns[2].Width = 100;
                    dg.Columns[3].Name = "Supplier";
                    dg.Columns[3].Width = 150;
                    dg.Columns[4].Name = "Total Items";
                    dg.Columns[4].Width = 80;
                    dg.Columns[5].Name = "Total";
                    dg.Columns[5].Width = 80;
                    dg.Columns[6].Name = "Status";
                    dg.Columns[6].Width = 100;
    
    
                });
                foreach (DataRow row in d.Rows)
                {
    
                    if (dg.InvokeRequired)
                    {
                        dg.BeginInvoke((MethodInvoker)delegate() { dg.Rows.Add(row[0].ToString(), row[1].ToString(), row[2].ToString(), row[3].ToString(), row[4].ToString(), row[5].ToString(), row[6].ToString()); });
                    }
    
    
                        Thread.Sleep(100);
                    }
                }
    
        }
    

    【讨论】:

      猜你喜欢
      • 2010-12-17
      • 2013-05-09
      • 2014-02-25
      • 2014-12-10
      • 2021-08-05
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多