【问题标题】:Adding data from dataset to datagridview table takes long time将数据从数据集添加到 datagridview 表需要很长时间
【发布时间】:2015-10-27 11:09:49
【问题描述】:

我正在尝试将大数据(大约 230,000 行 x 16 列)从数据集分配给 winform 中的 datagridview,并且在 datagridview 中加载需要很长时间。

在网上搜索了这个问题后,我找到了两种加快加载过程的解决方案,一种使用虚拟模式用于 datagridview,另一种解决方案是直接将数据集分配给 datagridview 数据源。

两个解决方案都有效,但仍然需要很长时间,因为第一个解决方案大约需要 15 分钟才能完成,而第二个解决方案大约需要 30 分钟。

所以我在下面列出了 2 个解决方案,以检查我没有遗漏任何内容,或者是否有针对此问题的其他解决方案。

第一种解决方案

    public Form1()
    {
        InitializeComponent();
        this.dataGridView1.Dock = DockStyle.Fill;
        this.Controls.Add(this.dataGridView1);
        this.Load += new EventHandler(Form1_Load);   
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.dataGridView1.VirtualMode = true;
        this.dataGridView1.CellValueNeeded += new
        DataGridViewCellValueEventHandler(dataGridView1_CellValueNeeded);

        DataSet DSg = ACC_Data.Get_DT(File_Path.Text.ToString());

        for (int i = 0; i < DSg.Tables[0].Columns.Count; i++)
        {
        this.dataGridView1.Columns.Add(DSg.Tables[0].Columns[i].ColumnName, DSg.Tables[0].Columns[i].Caption);
        }

        this.dataGridView1.RowCount = DSg.Tables[0].Rows.Count;

    }

    private void dataGridView1_CellValueNeeded(object sender,
        System.Windows.Forms.DataGridViewCellValueEventArgs e)
    {
        if (e.RowIndex == this.dataGridView1.RowCount - 2 && e.ColumnIndex == 0)
        {
            return;
        }

        e.Value = DSg.Tables[0].Rows[e.RowIndex][e.ColumnIndex];
    }

第二个解决方案

    public Form1()
    {
        InitializeComponent();
        this.dataGridView1.Dock = DockStyle.Fill;
        this.Controls.Add(this.dataGridView1);
        this.Load += new EventHandler(Form1_Load);   
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        DataSet DSg = ACC_Data.Get_DT(File_Path.Text.ToString());
        this.dataGridView1.DataSource = DSg.Tables[0];
    }

提前致谢。

【问题讨论】:

  • 你确定是DataGridView,它很慢,而且首先没有在DataSet中获取数据?
  • 是的,我很确定。 :D
  • 问题是:为什么要在DataGridView 中加载230K 行?在最可能的情况下,用户只能看到 20-50 行。你能指望什么?用户点击向下滚动按钮超过 5K 次?!将更少量的数据加载到 DataGridView 中不是更明智的做法吗?例如:允许用户搜索整个数据库;当目标位于第 50000 行时,您可以从第 40000 到第 60000 加载到 DataGridView 行。即使达到顶部/底部,您也可能会自动重新加载更多行...
  • ...您没有看到大多数现代网站加载大量数据的行为吗?例如:twitter.com。当用户向下/向上滚动时会加载更多数据,否则它们会非常慢。
  • 虚拟表的绑定对我来说只需几秒钟:var t = new DataTable(); for (int c = 0; c &lt; 16; c++) t.Columns.Add(); for (int r = 0; r &lt; 230000; r++) { var row = t.Rows.Add(r, r, r, r); row[10] = r; } dataGridView1.DataSource = t;

标签: c# data-binding datagridview


【解决方案1】:

我认为没有人会滚动并从这些大数据中找到一行.. 您应该只获得分配给数据网格的前 100 或 500 个值,并使用文本框或其他方式为其他人提供搜索选项。

【讨论】:

  • 你完全正确,因为我打算将其作为我的最后一个解决方案,尽管我处理的数据类型需要完全加载并为用户提供可视化。
【解决方案2】:

VirtualMode 本身很快。这里我有一个示例视频,展示了 9+ 百万行的 VirtualMode(Northwind 客户表复制了 N 次):

Virtual Mode Sample

表单的初始加载大约需要 8 秒,从那时起加载速度很快。

恕我直言,您加载缓慢的是数据集本身。您不应该一次加载整个数据,这就是使用 VirtualMode 之类的方法的重点。不幸的是,DataSet 天生就是一种缓慢的技术。 IOW 你应该克服这一行的缓慢:

DataSet DSg = ACC_Data.Get_DT(File_Path.Text.ToString());

如果您共享 ACC_Data.Get_DT() 代码,那么我们可能会建议加载速度更快(即使直接加载具有 230K 行的 DataSet,15 分钟也确实很慢)。

PS:我在这里发布了该视频的代码:

Virtual Mode Sample Code

【讨论】:

    【解决方案3】:

    感谢@ASh,我只是添加了一个虚拟表并将其绑定到 datagridview,如下面的代码所示,它在大约 20 秒内加载了数据。

    private void Form1_Load(object sender, EventArgs e)
    {
            DataSet DSg = ACC_Data.Get_DT(File_Path.Text.ToString());
    
            var t = new DataTable(); 
            for (int c = 0; c < DSg.Tables[0].Columns.Count; c++) t.Columns.Add();
    
            for (int r = 0; r < DSg.Tables[0].Rows.Count; r++)
            {
                string[] Dr = new string[DSg.Tables[0].Columns.Count];
                int i = 0;
    
                foreach (DataColumn C in DSg.Tables[0].Columns)
                {
                   Dr[i] = DSg.Tables[0].Rows[r][C].ToString();
                   i++;
                }
    
                var row = t.Rows.Add(Dr);
            }
    
            dataGridView1.DataSource = t;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-07
      • 1970-01-01
      • 2019-08-03
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2019-01-19
      相关资源
      最近更新 更多