您似乎需要使用 TimeSpan 比例显示每个数据源记录的时间值。虽然 DevExpress ChartControl 不支持 TimeSpan 刻度类型,但您可以使用以下方法生成所需的图表布局。
首先,定义一个额外的数字字段,该字段将用作 ValueDataMember 并包含与 TimeSpan 值对应的刻度数。
要显示 TimeSpan 标签而不是数值,请填充 自定义轴标签 元素的集合。
最后,通过处理 CustomDrawCrosshair 事件自定义十字准线光标标签文本。
请参阅说明此方法的示例源代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
List<MyData> inputData = new List<MyData>();
inputData.Add(new MyData() { ID = 1, ScannedDateTime = new DateTime(2019, 4, 1, 11, 22, 33) });
inputData.Add(new MyData() { ID = 2, ScannedDateTime = new DateTime(2019, 4, 2, 15, 00, 12) });
inputData.Add(new MyData() { ID = 3, ScannedDateTime = new DateTime(2019, 4, 3, 09, 11, 03) });
Series lineSeries = new Series("Scanned Date", ViewType.Line);
lineSeries.ArgumentDataMember = "ScannedDateTime";
lineSeries.ValueScaleType = ScaleType.Numerical;
lineSeries.ValueDataMembers.AddRange(new string[] { "TimeTicks" });
lineSeries.DataSource = inputData;
chartControl1.Series.Add(lineSeries);
XYDiagram diagram = (XYDiagram)chartControl1.Diagram;
diagram.AxisX.DateTimeScaleOptions.MeasureUnit = DateTimeMeasureUnit.Day;
for (int i = 0; i < 24; i++)
{
TimeSpan ts = new TimeSpan(i, 0, 0); //display tickmarks for every hour
diagram.AxisY.CustomLabels.Add(new CustomAxisLabel() { AxisValue = ts.Ticks, Name = ts.ToString() });
}
chartControl1.CustomDrawCrosshair += ChartControl1_CustomDrawCrosshair; // optional - if you need to show TimeSpan values in the Crosshair Cursor
}
private void ChartControl1_CustomDrawCrosshair(object sender, CustomDrawCrosshairEventArgs e)
{
foreach(CrosshairElementGroup g in e.CrosshairElementGroups)
{
foreach(CrosshairElement el in g.CrosshairElements)
{
TimeSpan ts = TimeSpan.FromTicks((long)el.SeriesPoint.Values[0]);
el.LabelElement.Text = string.Format("{0} - {1}", el.SeriesPoint.Argument, ts);
}
}
}
}
public class MyData
{
public int ID { get; set; }
public DateTime ScannedDateTime { get; set; }
public double TimeTicks
{
get
{
return ScannedDateTime.TimeOfDay.Ticks;
}
}
}