4,815
社区成员




DataTable CreateData(int rows)
{
Random _r = new Random();
DataTable dt = new DataTable();
dt.Columns.Add("Arg", typeof(DateTime));
dt.Columns.Add("Value", typeof(int));
DateTime now = DateTime.Now;
for (int i = 0; i < rows; i++)
{
dt.Rows.Add(now.AddHours(i), _r.Next(50));
}
return dt;
}
using System;
using System.Collections.Generic;
using System.Linq;
using DevExpress.XtraEditors;
using System.Data;
using DevExpress.XtraCharts;
namespace NewProject
{
public partial class Form1 : XtraForm
{
ViewType CurrentViewType = ViewType.Line;
public Form1()
{
InitializeComponent();
UpdateDataSource();
InitializeChartControl();
}
DataTable CreateData(int rows)
{
Random _r = new Random();
DataTable dt = new DataTable();
dt.Columns.Add("Arg", typeof(DateTime));
dt.Columns.Add("Value", typeof(int));
DateTime now = DateTime.Now;
for (int i = 0; i < rows; i++)
{
dt.Rows.Add(now.AddMinutes(i), _r.Next(50));
}
return dt;
}
private void InitializeChartControl()
{
chartControl1.Series.Clear();
chartControl1.Series.Add("MainSeries", CurrentViewType);
chartControl1.Series[0].ValueDataMembers.AddRange(new string[] { "Value" });
chartControl1.Series[0].ArgumentDataMember = "Arg";
chartControl1.Series[0].ArgumentScaleType = ScaleType.Qualitative;
XYDiagram diagram = (XYDiagram)chartControl1.Diagram;
diagram.AxisX.DateTimeOptions.Format = DateTimeFormat.Custom;
diagram.EnableAxisXZooming = true;
diagram.EnableAxisXScrolling = true;
CustomizeLabels(chartControl1);
chartControl1.Zoom += chartControl1_Zoom;
}
void chartControl1_Zoom(object sender, ChartZoomEventArgs e)
{
ChartControl chartControl = (ChartControl)sender;
CustomizeLabels(chartControl);
}
private void UpdateDataSource()
{
chartControl1.DataSource = CreateData(700);
}
private void CustomizeLabels(ChartControl chartControl)
{
XYDiagram diagram = (XYDiagram)chartControl.Diagram;
double max = diagram.AxisX.Range.MaxValueInternal;
double min = diagram.AxisX.Range.MinValueInternal;
diagram.AxisX.CustomLabels.Clear();
Series AvgSeries = new Series("AvgSeries", CurrentViewType);
SeriesPoint point = null;
for (int i = 0; i < chartControl.Series[0].Points.Count; i++)
{
if (i % Math.Round((max - min) / 7) == 0)
{
DateTime dataArg = chartControl.Series[0].Points[i].DateTimeArgument;
diagram.AxisX.CustomLabels.Add(new CustomAxisLabel(dataArg.ToString("yyyy-MM-dd HH:mm"), dataArg));
point = new SeriesPoint(dataArg, 10);
AvgSeries.Label.Visible = false;
AvgSeries.Points.Add(point);
}
}
if (chartControl1.Series.Count == 1)
{
chartControl1.Series.Add(AvgSeries);
}
}
}
}
1、同一天显示也是OK的
2、建议放弃这种实现方式,这种是通过滚动鼠标齿轮,动态重绘X轴坐标点,数据量在几百就会出现特别 卡的的现象
3、diagram.AxisX.Range.MaxValueInternal在滚动过齿轮、窗体大小发生变化的时候,都会改变。会给再你改变图标数据源的时候,带来一定的麻烦。public ViewType CurrentViewType { get; set; }
DataTable DataTable;
public Form1()
{
InitializeComponent();
UpdateDataSource();
InitializeChartControl();
}
DataTable CreateData(int rows)
{
Random _r = new Random();
DataTable dt = new DataTable();
dt.Columns.Add("Arg", typeof(DateTime));
dt.Columns.Add("Value", typeof(int));
for (int i = 0; i < rows; i++)
{
dt.Rows.Add(DateTime.Now.AddDays(i), _r.Next(50));
}
return dt;
}
private void InitializeChartControl()
{
CurrentViewType = ViewType.Line;
chartControl1.Series.Clear();
int lastSeriesIndex = chartControl1.Series.Add("MainSeries", CurrentViewType);
chartControl1.Series[lastSeriesIndex].ValueDataMembers.AddRange(new string[] { "Value" });
chartControl1.Series[lastSeriesIndex].ArgumentDataMember = "Arg";
chartControl1.Series[lastSeriesIndex].ArgumentScaleType = ScaleType.DateTime;
XYDiagram diagram = (XYDiagram)chartControl1.Diagram;
diagram.AxisX.DateTimeOptions.Format = DateTimeFormat.Custom;
diagram.EnableAxisXZooming = true;
diagram.EnableAxisXScrolling = true;
//diagram.AxisX.Range.MaxValue = DateTime.Now.AddDays(50);
//diagram.AxisX.Range.MinValue = DateTime.Now;
CustomizeLabels(chartControl1);
chartControl1.Zoom += chartControl1_Zoom;
}
void chartControl1_Zoom(object sender, ChartZoomEventArgs e)
{
ChartControl chartControl = (ChartControl)sender;
CustomizeLabels(chartControl);
}
private void UpdateDataSource()
{
chartControl1.DataSource = DataTable = CreateData(40);
}
private static void CustomizeLabels(ChartControl chartControl)
{
XYDiagram diagram = (XYDiagram)chartControl.Diagram;
double max = diagram.AxisX.Range.MaxValueInternal;
double min = diagram.AxisX.Range.MinValueInternal;
diagram.AxisX.CustomLabels.Clear();
for (int i = 0; i < chartControl.Series[0].Points.Count; i++)
{
if (i % Math.Round((max - min) / 7) == 0)
{
DateTime dataArg = chartControl.Series[0].Points[i].DateTimeArgument;
diagram.AxisX.CustomLabels.Add(new CustomAxisLabel(dataArg.ToString("yyyy-MM-dd HH:mm"), dataArg));
}
}
}