我有DataTable
我要在图表上显示的一些数据(测量值)。每条记录包含DataTime
值 - 进行测量时的实际日期时间和TimeSpan
值 - 相对测量时间(从进行第一次测量的那一刻起经过的时间)。
我希望能够在两种类型的x轴值之间切换:绝对值和相对值。 用简单的
在这些值之间切换很容易chart.DataSource = table; // table with columns: Time, Relative, D1, D2...
series.XValueMember = "Time"; // absolute - DateTime
series.XValueMember = "Relative";// relative - at 1st TimeSpan, now double
问题是DataPoints不接受TimeSpan
作为X值。我尝试将double
(TimeSpan.TotalDays
)与标签格式化
chart.ChartAreas[ 0 ].AxisX.LabelStyle.Format = "dd HH:mm:ss";
但是双倍于1的值(在达到24小时/ 1天之前)显示的值是30 xx:xx:xx ...
那30来自哪里?或者更确切地说,如何使用WinForms Chart控件正确显示相对时间?
编辑: 好吧,我知道30来自哪里,它是OADate:
DateTime dt = DateTime.FromOADate( 0.0 );
指定dt = 1899-12-30 00:00:00
的值,因此在图表中,double值以这种方式转换为DateTime(现在我认为它非常明显地转换),然后转换为指定格式的字符串。
我还检查了ILSpy,这正是引擎盖下发生的事情:( System.Windows.Forms.DataVisualization.Charting.Utilities.ValueConverter.FormatValue(...)方法的片段)
if (valueType == ChartValueType.DateTime || valueType == ChartValueType.DateTimeOffset || valueType == ChartValueType.Date)
{
...
text2 = string.Format(CultureInfo.CurrentCulture, text, new object[]
{
DateTime.FromOADate(value)
});
}
else
{
if (valueType == ChartValueType.Time)
{
...
text2 = string.Format(CultureInfo.CurrentCulture, text, new object[]
{
DateTime.FromOADate(value)
});
}
无论哪种方式,这都会让我想到我的基本问题 - 如何显示我想要显示的内容。 以这种方式使用DateTime总会给我正数天(1到31之间)。
结果可以是"天HH:mm:ss"或者"总小时数:mm:ss",其中总小时数可以超过24小时,并且当一整天过去时不会重置为0。