2016-10-04 37 views
0

我必须说,我一直在阅读这个网站很长一段时间,总是发现我在找什么。可悲的是,今天并非如此。设置DataGridView.DataSource异步

我有一个.NET C#Winforms应用程序,它使用MySQL .NET Connector来查询数据库并用结果填充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行,需要一些时间来加载,并在此期间,它阻止用户界面。

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

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

我还想知道是否有更好的方法来做到这一点,因为每次我在数据库表上进行更改时都会调用此方法,因此我可以显示用户更新的信息。

在此先感谢。

+0

20K在'DataGriView'中显示的行太多。使用分页加载数据会更好。还要防止加载数据时使用UI冻结异步/等待或加载数据在不同于UI线程的线程中。 [示例:在Windows窗体中将数据异步加载到我的DataTable中](http://stackoverflow.com/a/38427392/3110834) –

+0

@RezaAghaei我有一个实现MySqlDataAdapter.FillAsync方法的async/await方法。但是从数据库中提取数据实际上并没有冻结UI,因此设置了DataSource属性。而且我仍然会同步做这一步。你能告诉我更多关于加载与分页? –

+0

因此,在[虚拟模式](https://msdn.microsoft.com/en-us/library/15a31akc(v = vs.110).aspx)中使用'DataGridView'或加载分页数据。 –

回答

-1

使用线程。以编程方式填充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); 
       } 
      } 

    }