我有问题,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一样快地显示表的完整更新。