2016-07-29 6 views
0

Ich verwende das MS-Diagramm-Steuerelement in .Net 4, um 4 Datenreihen anzuzeigen, die X-Achse ist auf Datetime-Typ festgelegt.Datetime Typ X-Achse auf MS Chart-Steuerelement ohne Wochenenden anzuzeigen

mit dem auf Tage eingestellten Intervall schließt das Diagramm das Wochenende ein, obwohl in den Daten keine Wochenenddaten enthalten sind.

Alle Serien außer einem haben die gleichen Datumspunkte, die Ausnahme ist eine Projektionslinie, die am letzten Datum beginnt und für eine Anzahl von Arbeitstagen fortgeführt wird (Wochenenden ausgenommen).

Wie kann die Anzeige von Wochenenden (oder Daten, die keinen Wert haben) aus dem Diagramm für alle Serien entfernt werden?

Dies ist eine Winforms. NET 4.0-Anwendung.

foreach (var series in chart2.Series) 
    { 
     series.ChartType = SeriesChartType.Line; 
     series.BorderWidth = 5; 
     series.XValueType = ChartValueType.Date; 
     // I Tried this to remove weekends but it results in the graph showing a big red X 
     series.IsXValueIndexed = true; 
    } 

Bearbeiten mit-Code mein Problem unten zu reproduzieren:

 DateTime dt = DateTime.Now; 
     chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Days; 

     Series test1 = new Series("Test1"); 
     test1.XValueType = ChartValueType.Date; 
     for (int i = 1; i < 7; i++) 
     { 
      //skip the weekend 
      if (dt.DayOfWeek.ToString() == "Saturday") dt = dt.AddDays(1); 
      if (dt.DayOfWeek.ToString() == "Sunday") dt = dt.AddDays(1); 

      test1.Points.AddXY(dt.Date, i); 
      dt = dt.AddDays(1); 
      i++; 
     } 

     chart1.Series.Add(test1); 

     Series test2 = new Series("Test2"); 
     test1.XValueType = ChartValueType.Date; 
     for (int i = 1; i < 7; i++) 
     { 
      //skip the weekend 
      if (dt.DayOfWeek.ToString() == "Saturday") dt = dt.AddDays(1); 
      if (dt.DayOfWeek.ToString() == "Sunday") dt = dt.AddDays(1); 

      test2.Points.AddXY(dt.Date, i); 
      dt = dt.AddDays(1); 
      i++; 
     } 

     chart1.Series.Add(test2); 

     foreach (var series in chart1.Series) 
     { 
      series.ChartType = SeriesChartType.Line; 
      series.BorderWidth = 5; 
      series.IsXValueIndexed=true; 
     } 
     chart1.ChartAreas[0].AxisX.LabelStyle.Angle = 45; 
     chart1.ChartAreas[0].AxisX.LabelStyle.Interval = 1; 

Antwort

2

Sie fügen die x-Werte als DateTime, das ist, was Sie tun sollten. Aber standardmäßig bedeutet dies, dass alle x-Werte proportional zum Positionsende sind, wie man es normalerweise möchte.

Aber Ihr Fall ist eine Ausnahme ist, dass auch in der Dokumentation der Series.IsXValueIndexed Eigenschaft erwähnt:

alle Datenpunkte in einer Reihe aufeinanderfolgenden Indizes verwenden, und wenn diese Eigenschaft wahr ist, dann Datenpunkte sequentiell gezeichnet werden, ungeachtet ihrer zugehörigen X-Werte. Dies bedeutet, dass keine "fehlenden" Datenpunkte vorliegen.

zum Beispiel angenommen, es gibt drei (3) Datenpunkte in einer Reihe mit X-Werten von 1, 2 und 4. Wenn diese Eigenschaft falsch war, würde ein Daten sein Punkt an der X-Achse fehlt Standort mit der Bezeichnung "3". Wenn Sie jedoch diese Eigenschaft auf true festlegen, werden die drei Datenpunkte nacheinander unter Punkte 1, 2 und 4 gezeichnet, und es fehlen keine Daten Punkt. Die Position der X-Achse mit der Bezeichnung "3" erscheint nicht im Diagramm.

Dies ist nützlich, wenn Sie Datenpunkte für Intervalle nicht haben wollen fehlen, die Sie wissen, dass Sie keine Daten haben für, wie Wochenenden.

ist jedoch zu beachten:

Wenn Sie mehrere Serien sind die Anzeige und mindestens eine Serie verwendet indiziert X-Werte, dann müssen alle Serien ausgerichtet sein - das heißt, haben die gleiche Anzahl von Datenpunkten - und die entsprechenden Punkte müssen die gleichen X-Werte haben.

So waren Sie richtig diese Eigenschaft bei der Verwendung jedoch höchstwahrscheinlich Ihre Serie nicht vollständig ausgerichtet waren.

Um sicherzustellen, dass sie sind, kann man oft eine der Chart.DataManipulator.InsertEmptyPoints Überladungen verwenden. Leider arbeiten sie alle mit einer festen Interval, nicht mit einer Vorlage Series.

So müssen Sie sicherstellen, dass Sie eine Empty DataPoint hinzufügen, wo Ihre Daten einen Wert in einem Series fehlen. Wenn die Daten datengebunden sind, müssen Sie dies in der DataSource tun!

+0

Hi Taw, danke für Ihre Antwort, ich habe oben genannten Code hinzugefügt, um mein Problem zu zeigen! Wenn ich alle Test2 ausstempeln Sachen, die Test1 mit beiden funktioniert, bekomme ich das rote X. von oben muss ich eine leere Datenpunkte für alle Daten in Test eins und test2 zu beiden Reihen hinzufügen? – Adrian

+0

Ja, das ist, wenn du tatsächlich __wanted__ hast, um 'dt' weiter zu zählen, ohne es zwischen den beiden Serien zu setzen ..!? – TaW

+0

ja das ist nur ein Beispiel für real Ich zeichne eine Sequenz und dann eine Projektion, die die Linie erweitern wird. Wie sage ich alle leeren Datenpunkte zu jedem hinzufügen, wie sie über den Beginn von test2 und nach dem Ende von test1 sind? können Sie mir zeigen, wie ich das tun würde? – Adrian