Метка оси X MSChart не отображается - PullRequest
1 голос
/ 19 декабря 2011

В настоящее время я создаю приложение, которое показывает линейный график и использует MSChartControl.

Вот соответствующий код:

WeatherDatabase _db = new WeatherDatabase(Properties.Settings.Default.SqlConnectionString);

    private void AddSensorDataToGraph(int sensorType, string xTitle, string yTitle, string Title)
    {
        var sensorIdList = (from d in _db.Sensors where d.TypeId == sensorType select d.Id).ToArray();
        var startDate = dateTimePickerStart.Value;
        var stopDate = dateTimePickerStop.Value;

        SetMaxMinValues(dateTimePickerStart.Value.ToOADate(), dateTimePickerStop.Value.ToOADate());
        this.Text = chartValues.Titles["Titel"].Text = String.Format("{0} vom {1} bis {2}", Title, startDate, stopDate);
        chartValues.ChartAreas[CHARTAREA].AxisX.Title = xTitle;
        chartValues.ChartAreas[CHARTAREA].AxisY.Title = yTitle;
        // Alte Datensätze löschen
        chartValues.Series.Clear();
        foreach (var sensorId in sensorIdList)
        {
            var values = (from d in _db.DeviceIO where d.IdSensor == sensorId && d.Timestamp > startDate && d.Timestamp < stopDate orderby d.Timestamp ascending select d).ToArray();
            if (values.Length > 0)
            {
                var desc = values[0].Sensors.SensorType.Description;
                chartValues.Series.Add(GenerateDefaultSeries(String.Format("{0}\r\nSensorId: {1}", desc, sensorId)));
                //chartValues.Series.Add("Test" + sensorId);
                int seriesId = chartValues.Series.Count - 1;
                foreach (var item in values)
                {
                    if (item.Value == null)
                    {
                        continue;
                    }
                    if ((double)item.Value == NOVALUE)
                    {
                        continue;
                    }
                    AddPointToChart((DateTime)item.Timestamp, (double)item.Value, seriesId);
                }
            }
        }
    }

    private void AddPointToChart(DateTime timestamp, double value, int series)
    {
        DataPoint dataPoint = chartValues.Series[series].Points.Add(value);
        dataPoint.XValue = timestamp.ToOADate();
        dataPoint.AxisLabel = "dd.MM.yy hh:mm";
    }

    private void SetMaxMinValues(double min, double max)
    {
        if (min < max)
        {
            chartValues.ChartAreas[CHARTAREA].AxisX.Minimum = min;
            chartValues.ChartAreas[CHARTAREA].AxisX.Maximum = max;
        }
    }
    private Series GenerateDefaultSeries(string Name)
    {
        // Grundeinstellungen für die Data-Series setzen
        Series series = new Series();
        series.ChartType = SeriesChartType.Line;
        series.Name = Name;
        series.IsValueShownAsLabel = false;
        series.IsVisibleInLegend = true;
        series.IsXValueIndexed = false;
        series.AxisLabel = "dd.MM.yy hh:mm";
        // series.LabelFormat = "g";
        series.XAxisType = AxisType.Primary;
        series.XValueType = ChartValueType.Auto;
        series.YValuesPerPoint = 1;
        //    series.AxisLabel = "dd.MM.yy hh:mm";

        return series;
    }

Если я добавлю серию в режиме конструктора x-axies Ярлыки правильные Нажмите на картинку
Но если я запусту свое приложение и добавлю серию программным способом, это будет выглядеть как this

Кто-нибудь знает, почему x-заголовок / метка оси не отображается правильно?

РЕДАКТИРОВАТЬ: Основываясь на помощи Тома, я могу изменить некоторые вещи:

var seriesName = String.Format("{0}\r\nSensorId: {1}", desc, sensorId);
                var curSeries = chartValues.Series.Add(seriesName);

                UpdateSeriesSettings(ref curSeries);

              [...]
     AddPointToChart((DateTime)item.Timestamp, (double)item.Value, curSeries);

[...]

private void UpdateSeriesSettings(ref Series series)
{
    // Grundeinstellungen für die Data-Series setzen
    // Series series = new Series();
    series.ChartType = SeriesChartType.Spline;
    series.IsValueShownAsLabel = false;
    series.IsVisibleInLegend = true;
    series.IsXValueIndexed = false;
    series.AxisLabel = "dd.MM.yy hh:mm";
    // series.LabelFormat = "g";
    series.XAxisType = AxisType.Primary;
    series.XValueType = ChartValueType.Auto;
    series.YValuesPerPoint = 1;
    //    series.AxisLabel = "dd.MM.yy hh:mm";

}

Ноу моей оси X еще нет метки):

Использовал следующий код:

Исправлена ​​моя проблема.

var desc = values[0].Sensors.SensorType.Description;
var seriesName = String.Format("{0}\r\nSensorId: {1}", desc, sensorId);
curSeries = chartValues.Series.Add(seriesName);

curSeries.ChartType = SeriesChartType.Line;
curSeries.XValueType = ChartValueType.DateTime;

foreach (var item in values)
{
    curSeries.Points.AddXY(item.Timestamp, item.Value);
}

1 Ответ

2 голосов
/ 20 декабря 2011

Похоже, что вы добавляете каждую точку как отдельную серию. Обычно вы добавляете много точек в одну серию.

Намереваетесь ли вы изменить seriesId прямо перед его использованием?

   int seriesId = chartValues.Series.Count - 1;

Это происходит перед вызовом AddPointToChart (), так что оно получает значение, отличное от того, которое вы использовали в серии

chartValues.Series.Add(GenerateDefaultSeries(String.Format("{0}\r\nSensorId: {1}", desc, sensorId)));

EDIT

Строка chartValues.Series.Add (...) вернет переменную типа Series, которую вы можете добавить напрямую. см http://www.dotnetperls.com/chart

SensorID - ваш номер, и я думаю, что нет никаких гарантий, что система выберет заполнение своей коллекции Series в любом конкретном порядке.


EDIT

Похоже, вы добавляете свои очки в серию, прежде чем закончите их настройку. Вместо этого установите их полностью, затем добавьте их:

private void AddPointToChart(DateTime timestamp, double value, int series)
{
    DataPoint dataPoint = new DataPoint(timestamp.ToOADate(), value);
    dataPoint.AxisLabel = "dd.MM.yy hh:mm";  // not sure how this will work, but try it.
    chart1.Series[series].Points.Add(dataPoint );
}
...