将数据集中的数据添加到datagridview表需要很长时间

时间:2015-10-27 11:09:49

标签: c# data-binding datagridview

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

在网上搜索这个问题之后,我找到了两个解决方案来加速加载过程,一个使用virtualmode进行datagridview,另一个解决方案是直接将数据集分配给datagridview数据源。

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

所以我在下面列出了两个解决方案,以便检查我没有错过任何内容,或者可能还有其他解决方案可以解决这个问题。

第一个解决方案

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

提前致谢。

3 个答案:

答案 0 :(得分:1)

我不认为有人滚动并从这个大尺寸数据中找到一行.. 您应该只为数据网格分配前100或500个值,并使用文本框或其他任何内容为其他人提供搜索选项。

答案 1 :(得分:0)

VirtualMode本身就很快。这里我有一个示例视频,显示了包含9百多万行的VirtualMode(Northwind Customers表复制了N次):

Virtual Mode Sample

表单的初始加载大约需要8秒,从那里开始它很快。

恕我直言,你加载的数据集本身很慢。您不应该一次加载整个数据,这就是使用VirtualMode等方法的关键。不幸的是,DataSet诞生了一种缓慢的技术。你应该克服这一行的缓慢:

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

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

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

Virtual Mode Sample Code

答案 2 :(得分:0)

感谢@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;

}