none
WinForm中的DataGridView效能問題 RRS feed

  • 問題

  • 各位好!

    目前前台系統中使用DataGridView顯示商品,但當商品數量多時(100筆為例),發現SQL搜尋不到0.5秒,但前端的DataGridView元件顯示約需花1秒。

    stackoverflow以及codeproject等論壇上找過資料,但仍無法解決效能上的問題。

    請問這個問題有辦法解決嗎? 感謝~


    • 已編輯 DannyLee 2016年10月7日 上午 03:16
    2016年10月7日 上午 03:15

解答

  • 我用了一萬筆資料測試, 在顯示速度上沒有明顯延遲啊.

    public class MyData
        {
            public DataTable Table
            { get;private  set; }
    
            public MyData()
            {
                CreateTable();
                InitialData();
            }
    
            private void CreateTable()
            {
                Table = new DataTable();
                Table.Columns.Add(new DataColumn() { ColumnName = "Index" });
                Table.Columns.Add(new DataColumn() { ColumnName = "Description" });
                Table.Columns.Add(new DataColumn() { ColumnName = "CreateOn" }); 
    
            }
    
            private void InitialData()
            {
                for(int i=0; i < 10000; i++)
                {
                    var row = Table.NewRow();
                    row["Index"] = i.ToString();
                    row["Description"] = "這是一個測試用的字串";
                    row["CreateOn"] = DateTime.Now.ToString();
                    Table.Rows.Add(row);
                }
            }
    
        }

       public partial class Form1 : Form
        {
            private MyData data;
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                data = new MyData();
                dataGridView1.DataSource = data.Table.DefaultView;
            }
    
        }


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 DannyLee 2016年10月11日 上午 10:01
    2016年10月7日 上午 08:16
    版主
  • 如果你的資料庫不在相同電腦,而是透過網路,傳輸上會有延遲。

    另外加速顯示,可以透過

    DataGridView.SuspendLayout

    資料填入

    DataGridView.ResumeLayout


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 DannyLee 2016年10月11日 上午 10:01
    2016年10月8日 上午 07:06

所有回覆

  • 你原來的方式是怎麼做的 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年10月7日 上午 03:22
    版主
  • 你原來的方式是怎麼做的 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    下面是開發團隊成員那邊所寫的內容,感謝^^


    • 已編輯 DannyLee 2016年10月7日 上午 04:05
    2016年10月7日 上午 04:04
  • 我沒表達清楚. 我的意思是, 你們原來的程式是如何讓查詢的結果塞進 DataGridView 的 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2016年10月7日 上午 04:06
    版主
  • 我沒表達清楚. 我的意思是, 你們原來的程式是如何讓查詢的結果塞進 DataGridView 的 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    您好:塞進DataGridView的語法如下
    this.DGV.DataSource = ds.Tables[0].DefaultView; 
    2016年10月7日 上午 06:53
  • 我用了一萬筆資料測試, 在顯示速度上沒有明顯延遲啊.

    public class MyData
        {
            public DataTable Table
            { get;private  set; }
    
            public MyData()
            {
                CreateTable();
                InitialData();
            }
    
            private void CreateTable()
            {
                Table = new DataTable();
                Table.Columns.Add(new DataColumn() { ColumnName = "Index" });
                Table.Columns.Add(new DataColumn() { ColumnName = "Description" });
                Table.Columns.Add(new DataColumn() { ColumnName = "CreateOn" }); 
    
            }
    
            private void InitialData()
            {
                for(int i=0; i < 10000; i++)
                {
                    var row = Table.NewRow();
                    row["Index"] = i.ToString();
                    row["Description"] = "這是一個測試用的字串";
                    row["CreateOn"] = DateTime.Now.ToString();
                    Table.Rows.Add(row);
                }
            }
    
        }

       public partial class Form1 : Form
        {
            private MyData data;
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                data = new MyData();
                dataGridView1.DataSource = data.Table.DefaultView;
            }
    
        }


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 DannyLee 2016年10月11日 上午 10:01
    2016年10月7日 上午 08:16
    版主
  • 您好,

    或許可以下載 ANTS Performance Profiler 來看看是否有幫助。

    http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2016年10月8日 上午 01:50
  • 如果你的資料庫不在相同電腦,而是透過網路,傳輸上會有延遲。

    另外加速顯示,可以透過

    DataGridView.SuspendLayout

    資料填入

    DataGridView.ResumeLayout


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 DannyLee 2016年10月11日 上午 10:01
    2016年10月8日 上午 07:06
  • 經過實際測試,上面所提供的方法的確有加速的效果

    但是因為實際運作設備的硬體效能真的不佳,所以在實際的機器上面運作起來還是沒有太多的改善

    因此目前先傾向用資料分頁的方式來解決,謝謝各位的協助,感恩^^

    • 已編輯 DannyLee 2016年10月11日 上午 10:01
    2016年10月11日 上午 09:50
  • ADO.NET 分頁最佳化部分,原文微軟有人工翻譯的中文化,但因為全球統一為機器翻譯後,沒了,可以 google 這篇:

    https://www.google.com.tw/#q=%22%E4%BD%BF%E7%94%A8+ADO.NET+%E7%9A%84%E6%9C%80%E4%BD%B3%E7%B6%93%E9%A9%97%E5%88%86%E4%BA%AB%22


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2016年10月11日 下午 02:25