幾個重要的屬性
在介紹實現方法前需要先了解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 = {...};//需要顯示的數據 長度為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 [i*50000+n]; } DataPanel .add(smallArray); }
- 給chart控件添加滾動條
private void ChartScrollbarStyle() { chartAmend.ChartAreas[0].AxisX.ScrollBar.Enabled = true; chartAmend.ChartAreas[0].AxisX.ScaleView.Position = 1; chartAmend.ChartAreas[0].AxisX.ScaleView.Size = 300; chartAmend.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll; chartAmend.ChartAreas[0].AxisX.ScrollBar.ButtonColor = Color.Silver; chartAmend.ChartAreas[0].AxisX.ScrollBar.LineColor = Color.Black; chartAmend.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 = chart1.ChartAreas[0].AxisX.ScaleView.Size; if (e.Delta < 0) { position += 200;//滾輪動一下,移動多少數據 if (position >= chartAmend.ChartAreas[0].AxisX.Maximum - WindowSize)//一段數據顯示完畢 { DataCount++; if (DataCount >= DataPanel.Count) { MessageBox.Show("所有數據已經全部顯示完畢","提示"); DataCount = DataPanel.Count-1; return; } chart1.Series[0].Points.DataBindY(Overall.DataPanel[DataCount]); position = 1;//新的一段數據開始時 滾動條移動到最左側 } } else { position -= 200; if (position < 1) { if (DataCount == 0) { position = 1; MessageBox.Show("已經是第一個數據", "提示"); } else { DataCount--; } chart1.Series[0].Points.DataBindY(Overall.DataPanel[DataCount]); position = Convert.ToInt32(chart1.ChartAreas[0].AxisX.Maximum - WindowSize); } } chart1.ChartAreas[0].AxisX.ScaleView.Position = position; }
- 到此處,基本上就已經完成了。該方法本人經過驗證是可行的,但是因為本文的代碼是經過刪減整理的,可能會有一些問題。取用時要自行驗證。
