c#DataGridView太慢,无法重绘显示数据

时间:2014-04-28 14:27:16

标签: c# performance datagridview

我有问题,Windows窗体显示速度很慢,使用大量CPU,所以我试图逐个优化图形。

我使用DataGridView显示数据表,我喜欢这里继续更新是我的代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private DataTable myTable;
        private BindingSource mySource;
        private int numrows;
        private int numcols;
        private Random randNum;
        private bool wasActivated;

        public Form1()
        {
            InitializeComponent();
            numrows = 50;
            numcols = 20;
            randNum = new Random(DateTime.Now.Millisecond);
            myTable = new DataTable();
            mySource = new BindingSource();
            mySource.DataSource = myTable;

            dataGridView1.DataSource = mySource;

            Functions.DoubleBuffered(dataGridView1, true);

            for (int ii = 0; ii < numcols; ii++)
            {
                myTable.Columns.Add((ii+1).ToString(), typeof(double));
            }


            for (int ii = 0; ii < numrows; ii++)
            {
                myTable.Rows.Add();
            }
            timer1.Interval = 200;
            timer1.Start();
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (myTable != null)
            {
                //mySource.RaiseListChangedEvents = false;
                for (int ii = 0; ii < numrows; ii++)
                {
                    for (int jj = 0; jj < numcols; jj++)
                    {
                        myTable.Rows[ii][jj] = randNum.Next(100) / (double)randNum.Next(1, 100000);
                        //dataGridView1.Rows[ii].Cells[jj].Style.BackColor = Color.FromArgb(randNum.Next(256), randNum.Next(256), randNum.Next(256));
                        //dataGridView1.Rows[ii].Cells[jj].Style.BackColor = Color.Empty;
                    }
                }
                //mySource.RaiseListChangedEvents = true;
                //mySource.ResetBindings(true);
            }
        }

        private void Form1_Activated(object sender, EventArgs e)
        {
            if (!wasActivated)
            {
                dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;
                for (int ii = 0; ii < numrows; ii++)
                {
                    dataGridView1.Rows[ii].Height = dataGridView1.Rows[0].Height - 2;
                    dataGridView1.Rows[ii].Resizable = DataGridViewTriState.False;
                }
                dataGridView1.RowHeadersWidth = 50;
                dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
                dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
                for (int ii = 0; ii < numcols; ii++)
                {
                    dataGridView1.Columns[ii].SortMode = DataGridViewColumnSortMode.NotSortable;
                    dataGridView1.Columns[ii].Resizable = DataGridViewTriState.False;

                    dataGridView1.Columns[ii].Width = 80;
                    dataGridView1.Columns[ii].DefaultCellStyle.Font = new Font("Arial", 11.0F, GraphicsUnit.Pixel);
                }

                this.Height = dataGridView1.PreferredSize.Height;
                this.Width = dataGridView1.PreferredSize.Width;
                wasActivated = true;
            }
        }
    }
}

函数类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsFormsApplication1
{
    static class Functions
    {
        public static void DoubleBuffered(this DataGridView dgv, bool setting)
        {
            Type dgvType = dgv.GetType();
            PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
                BindingFlags.Instance | BindingFlags.NonPublic);
            pi.SetValue(dgv, setting, null);
        }
    }
}

在设计器中,我有一个表格,主格式中有一个数据网格视图和一个在代码中打开的计时器。

函数类用于在datagridview上启用双缓冲,使用反射在另一页上找到的代码。它绝对让它看起来更好,但它仍然很慢。

我只有一个50x20网格,只需5 fps即可更新,我的CPU几乎是固定的。

通过比较,我制作了一个包含50x20随机数单元格的excel文件并按住F9。 CPU被挂起,但值显示得更快。

请注意,如果DoubleBuffering处于关闭状态,因为单次刷新会从代码中花费相当多的时间,但在excel中,F9会立即刷新屏幕。

另外,我添加了一条注释掉的行来随机更改单元格背景颜色,当打开时它根本不会增加CPU使用率,这意味着它会一直重绘背景,所以我想知道这是否可以以某种方式进行优化。 / p>

我的目标是能够像Excel一样快地显示表的完整更新。

0 个答案:

没有答案