2011-12-19 250 views
1

我目前正在構建一個應用程序,顯示一個線圖並使用MSChartControl。MSChart X軸標籤不顯示

下面是相關代碼:

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軸距標籤了一系列正確 Click for pic
但如果我啓動我的應用程序,並添加了一系列編程它loks像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); 
} 

回答

2

它看起來像你將每個點添加爲自己的系列。通常,你可以在一個系列中添加許多點。

您是否打算在使用之前更改seriesId?

int seriesId = chartValues.Series.Count - 1; 

出現這種情況,你叫AddPointToChart(前),使越來越不同的值比您在系列中使用

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

編輯

線chartValues.Series.Add (...)將返回一個您可以直接添加的Series類型的變量。請參閱http://www.dotnetperls.com/chart

SensorID是您的編號,我認爲不能保證系統會選擇以任何特定順序填充其系列集合。


編輯

它看起來就像是增加您的積分系列設置完他們之前。相反,將它們設置爲一路,然後添加它們:

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); 
} 
+0

我將1..n個設備的數據添加到圖表中(溫度,壓力等)。 如果我需要爲每個設備設置一個新的「線路」,我需要爲每個設備準備一個新的系列...或者我是否錯誤地使用了這個思想? 我改變了seriesId,因爲我需要將點添加到我添加的右邊(例如,最後)系列。 Count - 1 =>添加了最後一個系列? – endofsource 2011-12-19 22:16:14

+0

ouh!這聽起來不錯..我試試看! – endofsource 2011-12-19 22:36:32

+0

我的X軸stil沒有標籤): – endofsource 2011-12-19 22:53:05