如何创建时间图表

时间:2018-11-11 20:15:07

标签: datetime charts .net-core

我有一个来自SQL Server的数据表,其中日期时间字段为ScannedDateTime 我正在尝试在VB NET中使用2种线型系列制作图表:

X-应该是ScannedDateTime字段中的日期

Y-应该是来自ScannedDateTime的时间

我不知道该怎么做?要将时间转换为十进制数字并将其显示为y轴还是什么?

我想将y保留为时间格式“ hh:mm”,并限制最小值作为工作时间示例:从07:00到15:00

Devexpress?

我尝试了这个,但是为什么要重复一次??

感谢创意

Time Chart

1 个答案:

答案 0 :(得分:0)

似乎您需要使用TimeSpan刻度显示每个数据源记录中的Time值。尽管DevExpress ChartControl不支持TimeSpan比例类型,但是您可以使用以下方法来生成所需的图表布局。

首先,定义一个额外的数字字段,该字段将用作ValueDataMember并包含与TimeSpan值相对应的刻度数。

要显示TimeSpan标签而不是数字值,请填充自定义轴标签元素的集合。

最后,通过处理 CustomDrawCrosshair 事件来自定义Crosshair Cursor标签文本。

请参考说明此方法的示例源代码:

 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;
        }
    }
}