2011-12-19 22 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-axiesにシリーズを追加した場合ラベルが Click for pic
正しいですが、私は自分のアプリケーションを起動し、プログラムシリーズを追加した場合、それはthisようloks:ここ

は、関連するコードです

x軸のキャプション/ラベルが正しく表示されない理由を知っていますか?

EDIT: トムのヘルプに基づいて、私はいくつかのことを変更します。

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軸はSTIL)ラベルを持っていません。

次のコードを使用しました。

問題を修正しました。

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

各ポイントを独自のシリーズとして追加しているようです。通常、1つのシリーズに多くのポイントを追加します。

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

私は1..nデバイスのデータをグラフ(温度、圧力など)に追加します。 すべてのデバイスに新しい「ライン」が必要な場合は、すべてのデバイスに新しいシリーズが必要...またはこの考えに間違っていますか? 私が追加した右(例えば最後の)シリーズにポイントを追加する必要があるので、seriesIdを変更します。カウント - 1 =>最後のシリーズが追加されましたか? – endofsource

+0

ouh!それは素敵な音..私はそれを試してみましょう! – endofsource

+0

私のX軸スチルはラベルを持っていません): – endofsource