C# 如何解决chart控件显示数据量过大时的卡顿问题
创作时间:
作者:
@小白创作中心
C# 如何解决chart控件显示数据量过大时的卡顿问题
引用
CSDN
1.
https://blog.csdn.net/qq_41848097/article/details/106119181
前言
Winform中自带的曲线显示控件Chart,在显示数据量过大时会出现卡顿的情况,导致用户体验不好。
针对这种情况本文通过数据分段的方法解决此类问题。
几个重要的属性
在介绍实现方法前需要先了解chart控件的几个属性
- ChartAreas :绘图区域,当数据量大时只要一个绘图区域。
- AxisX:X轴。(Y轴一致,此文进介绍X轴)。
- AxisX.ScrollBar:X轴滚动条。
- AxisX.ScaleView.Position:X轴显示的起始值。
- AxisX.ScaleView.Size:X轴显示数据的数量
图中
AxisX.ScaleView.Position = 941
AxisX.ScaleView.Size = 1941-941+1
实现思路
- 将数据分段每段10000到50000之间(以50000为例)。
- 给chart控件添加滚动条,
- 将第一个数据段的数据绑定到chart数据源上,给chart添加鼠标滚动事件。
- 滚动滚轮可以更改AxisX.ScaleView.Position的值,当显示完最后一个数值时,更改chart的数据源将第二段数据绑定在chart数据源上。
- 依次循环就可以实现所有数据的显示
代码实现
- 数据分段
double[] data = new double[2000*1000]{...};//需要显示的数据 长度为200万。
public List<double[]> DataPanel = new List<double[]>();
for(int m =0;m<40;m++)
{
double [] smallArray = new double [50000];
for(int n = 0;n<50000;n++)
{
smallArray [n] = data [m*50000+n];
}
DataPanel.Add(smallArray);
}
- 给chart控件添加滚动条
private void ChartScrollbarStyle()
{
chart1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
chart1.ChartAreas[0].AxisX.ScaleView.Position = 1;
chart1.ChartAreas[0].AxisX.ScaleView.Size = 300;
chart1.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll;
chart1.ChartAreas[0].AxisX.ScrollBar.ButtonColor = Color.Silver;
chart1.ChartAreas[0].AxisX.ScrollBar.LineColor = Color.Black;
chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = false;
}
- 将数据绑定在chart数据源上,更改DataCount,就更改了数据源。
int DataCount = 0;
chart1.Series[0].Points.DataBindY(DataPanel[DataCount]);
- 给chart控件添加鼠标滚轮事件
//该事件需要注册在方法中,最好可以放在构造方法中。
chart1.MouseWheel += Chart1_MouseWheel;
private void Chart1_MouseWheel(object sender, MouseEventArgs e)
{
int position = Convert.ToInt32(chart1.ChartAreas[0].AxisX.ScaleView.Position);
int WindowSize = (int)chart1.ChartAreas[0].AxisX.ScaleView.Size;
if (e.Delta < 0)
{
position += 200;//滚轮动一下,移动多少数据
if (position >= chart1.ChartAreas[0].AxisX.Maximum - WindowSize)//一段数据显示完毕
{
DataCount++;
if (DataCount >= DataPanel.Count)
{
MessageBox.Show("所有数据已经全部显示完毕", "提示");
DataCount = DataPanel.Count - 1;
return;
}
chart1.Series[0].Points.DataBindY(DataPanel[DataCount]);
position = 1;//新的一段数据开始时 滚动条移动到最左侧
}
}
else
{
position -= 200;
if (position < 1)
{
if (DataCount == 0)
{
position = 1;
MessageBox.Show("已经是第一个数据", "提示");
}
else
{
DataCount--;
}
chart1.Series[0].Points.DataBindY(DataPanel[DataCount]);
position = Convert.ToInt32(chart1.ChartAreas[0].AxisX.Maximum - WindowSize);
}
}
chart1.ChartAreas[0].AxisX.ScaleView.Position = position;
}
- 到此处,基本上就已经完成了。理论上讲可显示的数据量为无限大。并且该方法本人已经应用于超1000万数据显示的项目中,但是因为本文的代码是经过删减整理的,可能会有一些问题。取用时要自行验证。
热门推荐
投诉政务大厅工作人员怎么投诉(怎么投诉政务大厅窗口的工作人员)
牙科诊所好还是医院好?从医疗质量到价格全方位对比
如何向世人讲解佛法?佛说的秘诀就这8个字,弄明白后,受益匪浅
如何向世人讲解佛法?佛说的秘诀就这8个字,弄明白后,受益匪浅
有皮肤病可以泡温泉吗
有皮肤病可以泡温泉吗?这份安全指南请收好
葫芦代表的几大“吉祥”意义,你都知道吗
迷你主机优劣势解析
如何添加系统音频设备管理器
正月初七,庆人日,万事可期!
大年初七,为什么叫“人日”?怎么过?记住这5点,蛇年越过越顺
孕妇可以吃雪糕吗?8个注意事项请收好
慢性胃炎病人吃什么?一文详解饮食调理指南
方向盘设计是什么
原神可莉培养攻略 原神可莉武器圣遗物推荐
向量模型在法律问题中的构造与适用
罗振玉临安氏藏宋拓《石鼓文》
影视剧配音艺术:如何通过声音解析人物内心情感
钠电池材料检测的新方法
为什么我们总是会犯错?
电商客服如何巧用AI工具提升效率?
鸡蛋半年度总结:上半年蛋价低位反弹 下半年或高于预期
世界前沿医疗攻克尿毒症的新技术进展
中国量子计算机突破展现实力
中国量子计算机在国际外媒中引起广泛关注
FreeRTOS内存管理详解:5种内存分配方法对比与选择
摄影曝光:光的基本原理
什么?番茄酱ketchup的名字竟然是从中文来的?
400W、800W、1000W电动车最高车速能到多少?厂家是如何设定的?
人设崩塌刻在网红基因里?