Подтвердить что ты не робот

Как установить диапазон DateTime на оси X для System.Windows.Forms.DataVisualization.Charting?

В настоящее время я пытаюсь отобразить диаграмму с использованием оконных форм, которые показывают ежемесячные данные по оси X и целочисленное значение по оси Y; однако я не устанавливаю диапазон правильно для оси X, где MonthYear является DateTime:

var pnChart = new System.Windows.Forms.Panel();
pnChart.Controls.Clear();
DataTable dtChartData = myDatabaseLayer.BuildDataTable("SELECT Added, Modified FROM tblStatistics WHERE ApplicationID = " + intApplicationID + " ORDER BY MonthYear");
Chart chart = GenerateChart(dtChartData, pnChart.Width, pnChart.Height, "ActiveBorder", 6);
chart.Series[0].XValueType = ChartValueType.DateTime;
chart.ChartAreas[0].AxisX.LabelStyle.Format = "yyyy-MM-dd";
chart.ChartAreas[0].AxisX.Interval = 1;
chart.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Months;
chart.ChartAreas[0].AxisX.IntervalOffset = 1;
pnChart.Controls.Add(chart);

Проблема в том, что когда диаграмма отображается, ось X имеет дату-время "1900-01-01", поэтому мой вопрос заключается в том, как установить диапазон дат в 2013-01-01?

Обратите внимание, что я обыскал интернет и пробовал следующие настройки, но они не дают мне правильный диапазон:

chart.ChartAreas[0].AxisX.Maximum = DateTime.Now.Ticks;

Или

chart.ChartAreas[0].AxisX.Crossing = DateTime.Now.Ticks;

Или

chart.ChartAreas[0].AxisX.Minimum = DateTime.Now.Ticks;

ТИА.

UPDATE: Обратите внимание, что я нашел, как правильно установить диапазон, используя это:

            chart.Series[0].XValueType = ChartValueType.DateTime;
            DateTime minDate = new DateTime(2013, 01, 01);
            DateTime maxDate = DateTime.Now;
            chart.ChartAreas[0].AxisX.Minimum = minDate.ToOADate();
            chart.ChartAreas[0].AxisX.Maximum = maxDate.ToOADate();

Приведенный выше код устанавливает правильный диапазон для оси X; однако теперь сама диаграмма пуста.

ОБНОВЛЕНИЕ 2:

Да, спасибо DasKrumelmonster - это исправлено! Я использовал код http://www.codeproject.com/Articles/168056/Windows-Charting-Application и просто должен был более внимательно изучить защищенный автор встроенный Chart GenerateChart (DataTable dtChartDataSource, int width, int height, string bgColor, int intType). Чтобы исправить проблему, я изменил эти строки:

foreach (DataRow dr in dtChartDataSource.Rows)
{
    double dataPoint = 0;
    double.TryParse(dr[dc.ColumnName].ToString(), out dataPoint);
    DataPoint objDataPoint = new DataPoint() { AxisLabel = "series", YValues = new double[] { dataPoint } };
     chart.Series[series].Points.Add(dataPoint);
}

Для этого:

DateTime dtStart = new DateTime(2013, 01, 01);
int intMonthCounter = 0;
//Add data points to the series
foreach (DataRow dr in dtChartDataSource.Rows)
{
    double dataPoint = 0;
    double.TryParse(dr[dc.ColumnName].ToString(), out dataPoint);
    DataPoint objDataPoint = new DataPoint() { AxisLabel = "series", YValues = new double[] { dataPoint } };
    chart.Series[series].Points.AddXY(dtStart.AddMonths(intMonthCounter),  dataPoint);
    intMonthCounter++;
}

Спасибо!

4b9b3361

Ответ 1

Невозможно воспроизвести. Я пробовал этот код:

private void button1_Click(object sender, EventArgs e)
{
    var s = new Series();
    s.ChartType = SeriesChartType.Line;

    var d = new DateTime(2013, 04, 01);

    s.Points.AddXY(d, 3);
    s.Points.AddXY(d.AddMonths(-1), 2);
    s.Points.AddXY(d.AddMonths(-2), 1);
    s.Points.AddXY(d.AddMonths(-3), 4);

    chart1.Series.Clear();
    chart1.Series.Add(s);


    chart1.Series[0].XValueType = ChartValueType.DateTime;
    chart1.ChartAreas[0].AxisX.LabelStyle.Format = "yyyy-MM-dd";
    chart1.ChartAreas[0].AxisX.Interval = 1;
    chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Months;
    chart1.ChartAreas[0].AxisX.IntervalOffset = 1;

    chart1.Series[0].XValueType = ChartValueType.DateTime;
    DateTime minDate = new DateTime(2013, 01, 01).AddSeconds(-1);
    DateTime maxDate = new DateTime(2013, 05, 01); // or DateTime.Now;
    chart1.ChartAreas[0].AxisX.Minimum = minDate.ToOADate();
    chart1.ChartAreas[0].AxisX.Maximum = maxDate.ToOADate();
}

Возможно, я исправил вашу ошибку в пути.

Он работает так, как ожидалось: одна строка с четырьмя точками данных, все метки x-осей видны, а также сам график. Если все еще есть проблема, предоставьте полный код тестирования вместе с описанием того, что должно произойти в сравнении с тем, что на самом деле происходит.