设置DataGridView.DataSource异步

时间:2016-10-04 17:13:47

标签: c# mysql winforms datagridview

我必须说我已经读了这个网站很长一段时间,总能找到我想要的东西。可悲的是,今天情况并非如此。

我有一个.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异步?或者也许是在数据加载时我仍然可以使用表单的方式?

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

提前致谢。

2 个答案:

答案 0 :(得分:0)

文档建议使用" 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

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

答案 1 :(得分:-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);
                }
            }

    }