none
Problem mit ChartValueType RRS feed

  • Frage

  • Hallo

    Ich stelle Werte aus einem DataSet in einem Chart dar. Dabei sind die Werte entweder Zahlen (Double) oder vom Typ DateTime. Die Darstellung funktioniert in beiden Fällen. Sobald aber einmal die x-Achse mit Datumswerten belegt wurde, funktioniert nachher die Achsendarstellung mit Zahlen nicht mehr. Die x-Achse ist dann garnicht mehr mit Zahlen beschriftet.

    Mit den ChartValueTypes wollte ich das wie folgt anpassen:

                    If ds.Tables(0).Columns(xWertName).DataType = System.Type.GetType("System.DateTime") And Not IsNothing(xWerteDatum) And Not IsNothing(yWerte) Then
                        Chart1.Series("DataSeries").Points.DataBindXY(xWerteDatum, yWerte)
                        Chart1.Series("DataSeries").XValueType = ChartValueType.Date
                    ElseIf Not IsNothing(xWerte) And Not IsNothing(yWerte) Then
                        Chart1.Series("DataSeries").Points.DataBindXY(xWerte, yWerte)
                        Chart1.Series("DataSeries").XValueType = ChartValueType.Double
                    End If

    Das Problem besteht aber weiterhin. Auch wenn ich alle Series lösche und neu hinzufüge mit den neuen Daten.

    Wie muss ich die Achseneinstellungen anpassen, damit auch nach Datumswerten auf der x-Achse die Darstellung von Zahlenwerten funktioniert?

    Gruss

    Martin

    Mittwoch, 22. Juni 2011 07:00

Antworten

  • Hi,

    nach dem Zuweisen der neuen Werte an die Series.Points, führe

     

     Chart1.ResetAutoValues()
    

    aus, dann sollte es gehen.

    Also etwa (bezogen auf obiges Example)

        Chart1.Series(0).Points.DataBind(f.DefaultView, "xWerte", "yWerte", Nothing)
        Chart1.Series(0).XValueType = DataVisualization.Charting.ChartValueType.Int32
        Chart1.ResetAutoValues()

    Viele Grüße,

      Thorsten

     

     



    Dienstag, 28. Juni 2011 16:06
  • Hi,

    wird denn überhaup etwas angezeigt dann?

    Du könntest mal das standard-databinding verwenden:

     

    Public Class Form1
     Dim f As DataTable = New DataTable()
     Dim fz As DataTable = New DataTable()
     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      f.Columns.Add(New DataColumn("xWerte", GetType(Int32)))
      f.Columns.Add(New DataColumn("yWerte", GetType(Int32)))
    
      fz.Columns.Add(New DataColumn("xWerteDatum", GetType(DateTime)))
      fz.Columns.Add(New DataColumn("yWerte", GetType(Int32)))
    
      For i As Integer = 0 To 4
       Dim dr As DataRow = f.NewRow()
       dr(0) = i
       dr(1) = i * 3
       f.Rows.Add(dr)
    
       Dim dr2 As DataRow = fz.NewRow()
       dr2(0) = DateTime.Now.AddDays(i)
       dr2(1) = i * 4
       fz.Rows.Add(dr2)
      Next
    
      Chart1.Series(0).Points.DataBind(f.DefaultView, "xWerte", "yWerte", Nothing)
      Chart1.Series(0).XValueType = DataVisualization.Charting.ChartValueType.Int32
     End Sub
    
     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      Chart1.Series(0).Points.DataBind(fz.DefaultView, "xWerteDatum", "yWerte", Nothing)
      Chart1.Series(0).XValueType = DataVisualization.Charting.ChartValueType.DateTime
     End Sub
    End Class
    
    
    

    Viele Grüße

     

      Thorsten


    Mittwoch, 22. Juni 2011 17:41

Alle Antworten

  • Hi,

    wird denn überhaup etwas angezeigt dann?

    Du könntest mal das standard-databinding verwenden:

     

    Public Class Form1
     Dim f As DataTable = New DataTable()
     Dim fz As DataTable = New DataTable()
     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      f.Columns.Add(New DataColumn("xWerte", GetType(Int32)))
      f.Columns.Add(New DataColumn("yWerte", GetType(Int32)))
    
      fz.Columns.Add(New DataColumn("xWerteDatum", GetType(DateTime)))
      fz.Columns.Add(New DataColumn("yWerte", GetType(Int32)))
    
      For i As Integer = 0 To 4
       Dim dr As DataRow = f.NewRow()
       dr(0) = i
       dr(1) = i * 3
       f.Rows.Add(dr)
    
       Dim dr2 As DataRow = fz.NewRow()
       dr2(0) = DateTime.Now.AddDays(i)
       dr2(1) = i * 4
       fz.Rows.Add(dr2)
      Next
    
      Chart1.Series(0).Points.DataBind(f.DefaultView, "xWerte", "yWerte", Nothing)
      Chart1.Series(0).XValueType = DataVisualization.Charting.ChartValueType.Int32
     End Sub
    
     Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
      Chart1.Series(0).Points.DataBind(fz.DefaultView, "xWerteDatum", "yWerte", Nothing)
      Chart1.Series(0).XValueType = DataVisualization.Charting.ChartValueType.DateTime
     End Sub
    End Class
    
    
    

    Viele Grüße

     

      Thorsten


    Mittwoch, 22. Juni 2011 17:41
  • Hallo

    Der Chart wurde auch nach dem Wechsel von Datum zu Double-Werten normal angezeigt. Nur die Achsenbeschriftung bleibt bei Datum und wechselt nicht auf normale Zahlen. Ich habe herausgefunden, dass bei genug grossen Zahlenwerten im Diagramm immernoch die Datumsbeschriftung vorhanden ist. Bei kleineren Zahlen stehen einfach garkeine Werte auf der Achse.

    Meine momentane Lösung ist etwas unschön, aber funktioniert grundsätzlich. Nicht nur die Series, sondern auch die ChartAreas löschen und neu hinzufügen bevor die Datenquelle gewechselt wird.

                Energiedatenbank.Chart1.ChartAreas.Clear()
                Energiedatenbank.Chart1.ChartAreas.Add("ChartArea1")

    Irgendwie muss in der ChartArea die Information gespeichert sein, dass auf der x-Achse Datumswerte waren. Nur mit der Angabe des ChartValueType.Double funktioniert das ändern des Datentyps bei mir immernoch nicht.

     

    Gruss Martin


    Dienstag, 28. Juni 2011 15:37
  • Hi,

    nach dem Zuweisen der neuen Werte an die Series.Points, führe

     

     Chart1.ResetAutoValues()
    

    aus, dann sollte es gehen.

    Also etwa (bezogen auf obiges Example)

        Chart1.Series(0).Points.DataBind(f.DefaultView, "xWerte", "yWerte", Nothing)
        Chart1.Series(0).XValueType = DataVisualization.Charting.ChartValueType.Int32
        Chart1.ResetAutoValues()

    Viele Grüße,

      Thorsten

     

     



    Dienstag, 28. Juni 2011 16:06
  • Hi Thorsten,

    Genau das hat gefehlt. Vielen Dank!

    Jetzt funktioniert es einwandfrei.

     

    Gruss Martin

    Mittwoch, 29. Juni 2011 06:49