簡體   English   中英

設置DataGridView.DataSource異步

[英]Set DataGridView.DataSource async

我必須說,我已經閱讀該網站很長時間了,並且總是找到我想要的東西。 可悲的是,今天並非如此。

我有一個.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行,因此加載需要花費一些時間,與此同時,它會阻塞UI。

做一些測試,我得出的結論是數據庫查詢Fill()的速度非常快(實際上需要10毫秒)。 因此,設置DataGridView.DataSource屬性會延遲整個操作

所以我的問題是,有沒有辦法設置DataSource屬性異步? 還是一種在數據加載時仍可以使用表單的方式?

我還想知道是否有更好的方法來執行此操作,因為每次對數據庫表進行更改時都會調用此方法,以便向用戶顯示更新的信息。

提前致謝。

文檔建議使用“ viralmode”屬性設置。

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

還有另一個有趣的主題“及時加載”。 在Windows窗體DataGridView控件中通過實時數據加載實現虛擬模式

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

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

使用線程。 以編程方式而不是使用DataSource填充DataGridView。

 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);
                }
            }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM