Как создать точную диаграмму - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть данные из SQL Server с полем даты и времени ScannedDateTime Я пытаюсь сделать диаграмму в VB NET с двумя рядами линий:

X - должна быть дата из поля ScannedDateTime

Y - должно быть время от поля. ScannedDateTime

Понятия не имею, как это сделать? Чтобы преобразовать время в десятичные числа и показать его как ось y или как?

Я бы хотел сохранить y в формате времени "чч: мм" и ограничить минимальное значение в качестве примера рабочего времени: с 07:00 до 15:00

DevExpress

Я пробовал это, но почему время повторяется ???

Спасибо за идею

Time Chart

1 Ответ

0 голосов
/ 25 апреля 2019

Похоже, вам нужно показывать значение времени из каждой записи источника данных с использованием шкалы TimeSpan. Хотя DevExpress ChartControl не поддерживает тип масштаба TimeSpan, вы можете использовать следующий подход для создания требуемого макета диаграммы.

Сначала определите дополнительное числовое поле, которое будет использоваться в качестве ValueDataMember и будет содержать количество тиков, соответствующее значению TimeSpan.

Чтобы отображать метки TimeSpan вместо числовых значений, заполните коллекцию пользовательских меток оси элементов.

Наконец, настройте текст метки Crosshair Cursor, обработав событие 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;
        }
    }
}
...