C#图表:如何在x轴上显示相对时间

时间:2014-12-05 12:14:43

标签: c# winforms charts .net-4.0

我有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值。我尝试将doubleTimeSpan.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。

0 个答案:

没有答案