Wie Chart erstellen und mit Daten versorgen und allgemeine Fragen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wie Chart erstellen und mit Daten versorgen und allgemeine Fragen

    Ich bin noch ein blutiger VB Anfänger und lese mich gerade ein und probiere viel aus. Die ersten Schritte sind noch etwas schwerfällig... (wie zu erwarten ;) )
    - Ich habe kein Anfängerunterforum gefunden. Gibt es hier keine Anfänger und ich bin in einem Forum für Fortgeschrittene gelandet? (nicht böse gemeint)
    - Wie postet man problematischen/fraglichen VB-Code, da er doch in eine Projekt steckt und oftmals mit einer Form-Datei verbunden ist? Muss ich das ganze Projekt als ZIP-File hier anhängen? Bisher kenne ich es so, dass man bei einer Frage möglichst ein kleines Programm schreibt, welches den Fehler zeigt, so dass das Problem isoliert besprochen werden kann. Ich kann momentan die ganzen Verbinden innerhalb des Visual Studio2013 noch nicht überblicken.
    - Beim Ausprobieren bin ich in der Toolbar auch CHART gestoßen. Das finde ich sehr spannend, da es für mich sehr viel erleichtern würde. Bisher habe ich mit meiner alten Programmiersprache (Purebasic) die Ausgaben von Messwerten und Graphen immer per Hand programmieren müssen, was recht umständlich war.
    Es würde ich freuen, wenn ihr mir bei einem kleinen Beispiel helfen könntet, damit ich es dann als Übung selbst erweitern kann. Kennt ihr vielleicht eine Beispielsammlung mit allgemeinen kleineren Programmen. Bisher habe mir Beispielsammlungen immer sehr geholfen.

    Was ist das Ziel von meinem kleinen Übungsprojekt:
    Ich möchte X-Y-Daten in einem Array speichern, welche dann als xy-Graph in einem Chart ausgegeben werden, wobei die x-Achse logarithmisch unterteilt wird.

    Bisher habe ich für drei Zahlenpaare Textboxen erstellt und ein Chart/Diagramm eingefügt und mit den Voreinstellungen gespielt. Im Form-Desinger habe ich als Anfang drei Zahlenpaare fest vorgeben.

    Hier die Fragen:
    - Wie kann ich Zahlenpaare an eine Chart-Element übergeben und anzeigen lassen, welches ich im Formeditor erstellt habe?
    - Kann man ganz einfach die Werte aus einem Array an das Chart übergeben?
    - Konfiguriert man am besten Chart-Elemente möglichst umfangreich im Form-Editor oder besser über einzelne Befehlszeilen?

    Hier das ganze angefangene Projekt als ZIP File. (vb VisualStudio2013)
    Dateien
    Imo sollte man das Chart im Zusammenhang mit Datenverarbeitung und Databinding sehen.
    Wenn man letzteres versteht, kann man mit paar Klicksen ungeheuer viel auf die Beine stellen mit sonem ChartControl.
    Aber als Anfänger fürchte ich wirst du dir vmtl. gewaltig ein abbrechen.
    Hier kannst du ein Sample downloaden: Chart - Sample
    Und dort der "letzte Link" führt noch zu viel mehr Beispielen.

    Wie gesagt - kein Anfänger-Stoff. Bevor man sich daran macht, sollte man die Datenverarbeitungs-Vorraussetzungen intus haben - dann wird auch das Rumspielen mittm Chart-Control zum Kinderspiel.

    Und eine gscheite Datenverarbeitung brauchst du eh, denn du wirst die Daten ja auch in anderen Weisen aufarbeiten und präsentieren wollen, und abspeichern, zufügen, löschen und Zeugs.
    Das hängt alles miteinander zusammen in einem Gesamtpaket, was ich dir wirklich empfehlen würde.

    Natürlich kann man auch im ChartControl mit myChart.Series(0).Points.AddPoint(x, y) oder so die Pünktchen einzeln zufügen und wieder wegmachen - aber damit kenn ich mich noch weniger aus.

    egon schrieb:

    Hier die Fragen:
    Eine weitere Antwort: Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die schnellen Antworten
    @ErfinderDesRades: Ich muss zugeben, dass mich deine Lösungsvariante momentan noch deutlich überfordert - so wie du es auch vorhergesehen hast. Ich werte es mir aber trotzdem morgen nochmals genauer ansehen. Ich kann noch nicht einmal die Vorteile von deiner Herangehensweise richtig erfassen.
    @RodFromGermany: Deinen Weg kann ich mit meinem Wissensstand schon eher erfassen. Die Möglichkeit von "DataTable" begeistern mich. Da ist ja viel mehr Flexibilität möglich, als ich bisher von Arrays kennen gelernt habe. So richtig erfassen kann ich es aber noch nicht alles. Ich muss jetzt erst einmal damit spielen und viel lesen. Es werden dann bestimmt noch einige Fragen übrig bleiben. Daher werde ich für mich deinen Code mit Kommentaren und Fragen versehen und hier wieder einstellen - wenn ich etwas weiter bin.

    Wie speichert man am besten unterschiedliche Versionen seiner Programmierversuche? Geht das innerhalb von dem Project oder besser jeweils in neuen Projekten.
    Wie speichert man das Project unter einem neuen Namen? Mir fehlt der Punkt "Save Project as...".
    Kann man den Ausdruck von dem Programm-Code auch auf Farbe umschalten, damit er sich dann leichter lesen lässt?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „egon“ ()

    im VisualStudio eingebaut ist eine sog. Versionierung - TeamExplorer und pipapo. Damit kann man alle möglichen Stadien und Versionen iwie managen - tatsächlich kenne ich mich damit garnet aus.
    Ich hab mir selbst ein Tool gecodet, mit dem ich die Sources einer Solution verzippen kann - das benutze ich eiglich ständig:
    SolutionExplorer - OpenSource

    Und wg deines Wissensstandes ist meine Empfehlung: Leg deinen Schwerpunkt weniger auf deine Chart-Anwendung, und mehr darauf, deinen Wissenstand auf Vordermann zu bringen.
    Weil da geht eh kein Weg dran vorbei, und wenn du dich verfrüht auf Sachen stürzst, die du einfach noch nicht effizient handeln kannst - naja im besten Falle Tonne, wenndes dann schließlich gelernt hast.
    Im schlimmsten Falle lernstes so nie.

    Bau dein Knowhow nach dem in Datenverarbeitungs-Vorraussetzungen gegebenen Plan auf - das stellt die effiziente Nutzung des VisualStudios in den Vordergrund, was auch für jedes "Learning by Doing" die beste Vorraussetzung ist.

    Also die dort genannten Sachen lernst du so oder so. Wenn nicht direkt, dann lernstes halt irgendwann, auf die mühsame Tour.

    egon schrieb:

    unterschiedliche Versionen
    Wenn Du eins oder mehrere Projekte kontinuierlich bearbeitest, empfiehlt sich ein Codeverwaltungssystem, z.B. SVN, CVS, Git, TFS. Für privat ziehe die beiden ersteren in die engere Wahl.
    "Save Project as..." ist nicht vorgesehen, da Projekte üblicherweise so groß und verknüpft sind, dass das nicht ohne weiteres geht.
    Wenn Du Code mehrfach nutzen willst, pack ihn in eine DLL und nutze diese in den betreffenden Projekten.
    Farbdruck: Jou, kommt nicht vor, nur die Zeilennummern haben eine andere Farbe.
    Kopier den Code aus dem Studio in ein Word-Dokument und druck dieses.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für eure Beiträge.

    ErfinderDesRades hat geschrieben:

    Wie gesagt - kein Anfänger-Stoff. Bevor man sich daran macht, sollte man die Datenverarbeitungs-Vorraussetzungen intus haben - dann wird auch das Rumspielen mit Chart-Control zum Kinderspiel.

    Und eine gscheite Datenverarbeitung brauchst du eh, denn du wirst die Daten ja auch in anderen Weisen aufarbeiten und präsentieren wollen, und abspeichern, zufügen, löschen und Zeugs.

    Das hängt alles miteinander zusammen in einem Gesamtpaket, was ich dir wirklich empfehlen würde.


    Ich habe jetzt so viel gelesen, dass ich nachvollziehen kann, dass ich mich in eine vernünftige Datenverarbeitung einarbeiten muss. Momentan stelle ich aber fest, dass dies für mich eine Überforderung ist und es zu einem späteren Zeitpunkt nachgeholt werden muss. Ich muss damit leben, dass mein erster Entwurf viele Ecken und Kanten hat und viel zu umständlich sein wird. Das Projekt, welches ich im Kopf habe, möchte ich gerne als Lernprojekt verwirklichen, weil ich es auch gerade gebrauchen kann und es mich außerdem interessiert. Ich bin mir sicher, dass mit erweiterten Kenntnissen das Programm bestimmt nochmals neu geschrieben wird – was nicht schlimm ist.

    Zu dem Programmcode, den RodFromGermany vorgeschlagen hat, hätte ich einige Fragen, die ich in das folgende Programmlisting eingefügt habe. Vielleicht könnt ihr mir helfen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private table As DataTable
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Me.InitDataTable()
    5. Me.InitData()
    6. End Sub
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. ' Hier werden die Daten bereitgestellt:
    9. Me.InitData() 'Tabellensystem (wie lautet der richtig Begriff??) löschen, da sonst die Tabelle immer größer wird
    10. For i As Integer = 0 To 200
    11. Dim newRow As DataRow = Me.table.NewRow()
    12. newRow(0) = i
    13. newRow(1) = Math.Sin(i / 10)
    14. newRow(2) = i / 10 + Math.Sin(i / 10) 'neue Berechung der zweiten Kurve
    15. Me.table.Rows.Add(newRow)
    16. Next
    17. 'Kann man eigentlich auch zu bestimmten Elementen springen? Z.B. zu dem Werten, die für i=40 berechnet worden sind?
    18. 'Können nun nachträglich noch einzelne Elemente bearbeitet werden?
    19. Me.ShowData()
    20. End Sub
    21. Private Sub InitDataTable()
    22. Me.table = New DataTable()
    23. Me.table.TableName = "TestDaten"
    24. ' für das DGV
    25. Me.table.Columns.Add(New DataColumn() With { _
    26. .ColumnName = "Coordinate", _
    27. .DataType = GetType(Double) _
    28. })
    29. ' für das DGV
    30. Me.table.Columns.Add(New DataColumn() With { _
    31. .ColumnName = "Value", _
    32. .DataType = GetType(Double) _
    33. })
    34. ' nur zum Testen -- für die zweite Kurve
    35. Me.table.Columns.Add(New DataColumn() With { _
    36. .ColumnName = "Value_2", _
    37. .DataType = GetType(Double) _
    38. })
    39. End Sub
    40. Private Sub InitData()
    41. ' DataSource löschen
    42. Me.table.Clear() 'table leeren
    43. Me.DataGridView1.DataSource = Nothing 'Das habe
    44. ich nicht verstanden. Wir hier ein leeres GridView angelegt?
    45. Me.Chart1.DataSource = Nothing
    46. 'Me.Chart1.Series(1).ChartType = SeriesChartType.Line 'Warum geht das nicht?
    47. 'Es soll die Balkengrafik auf xy-Diagramm umgestellt werden. Momentan habe ich dies im Formeditor vorgenommen
    48. 'Zu Übungszwecken soll dies aber an dieser Stelle vorgenommen werden. Wie lautet der Code?
    49. ' uninitialisiert => dynamische xy-Skalierung
    50. Me.Chart1.ChartAreas(0).AxisX.Maximum = Double.NaN
    51. Me.Chart1.ChartAreas(0).AxisX.Minimum = Double.NaN
    52. Me.Chart1.ChartAreas(0).AxisY.Maximum = Double.NaN
    53. Me.Chart1.ChartAreas(0).AxisY.Minimum = Double.NaN
    54. Me.Chart1.ChartAreas(0).AxisX.Title = "Coordinate"
    55. Me.Chart1.ChartAreas(0).AxisY.Title = "Value"
    56. End Sub
    57. Private Sub ShowData()
    58. Me.Chart1.DataSource = Me.table 'table als Datenquelle mit Chart1 verbinden
    59. Me.Chart1.Series(0).XValueMember = Me.table.Columns(0).ToString()
    60. Me.Chart1.Series(0).YValueMembers = Me.table.Columns(1).ToString()
    61. Me.Chart1.Series(1).XValueMember = Me.table.Columns(0).ToString() 'zum Anzeigen der zweiten Kurve
    62. Me.Chart1.Series(1).YValueMembers = Me.table.Columns(2).ToString() 'zum Anzeigen der zweiten Kurve
    63. Me.Chart1.DataBind() 'nun werden die Daten von 'table' mit der Chart1 verbunden
    64. Me.DataGridView1.DataSource = Me.table '??? Daten werden akualisiert ???? oder
    65. Me.DataGridView1.CurrentCell = Me.DataGridView1.Item(0,
    66. Me.DataGridView1.Rows.Count - 2) ' letzte Zeile anzeigen '??? keine
    67. Ahnung nicht verstanden
    68. End Sub
    69. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    70. Me.table.WriteXml("c:\Temp\test.xml")
    71. Me.InitData()
    72. End Sub
    73. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    74. Try
    75. Me.table.ReadXml("c:\Temp\test.xml")
    76. Me.ShowData()
    77. Catch ex As Exception
    78. MessageBox.Show("no or wrong data available")
    79. End Try
    80. End Sub
    81. End Class


    Kann man eigentlich auch bei einem DataTable die einzelnen Elemente einzeln anspringen wie bei einem Array?

    @RodFromGermany
    Könntest du mir bitte einen Link nennen zu dem Codverwaltungssystem SVN oder CVS nennen? Als Anfänger würde ich mich über einen direkten Link freuen, da schon so genug neues auf mich einprasselt...



    Mein Lernprojekt und meine momentane Lösungsidee möchte ich hier mal kurz vorstellen:

    Eine mathematische Formel soll halblogarithmisch dargestellt werden. Verschiedene Parameter zur Berechnung der math. Formel sollen aus verschiedenen TextBoxen ausgelesen werden. Dann soll man noch die Möglichkeit habe eine Berechnung als Memory in eine zweite Funktion kopieren zu können.
    Nun habe ich genug mit der allgemeinen Programmgestaltung zu tun und schlage eine eher umständliche Verarbeitung der Daten vor.
    Es soll ein Array erstellt werden, welches die Werte für x-Wert, Y1-Wert und Y2-Wert enthält. Das Berechnen des Array und kopieren der Y1 Werte auf Wunsch nach Y2 (Memory) bekomme ich hin. Es ist eine Fleißarbeit, wenn auch nicht elegant. Zur Darstellung der Graphen wird dann alles an das DataTable übergeben, indem das Array kopiert wird und in der Chart dargestellt.
    Mit der Umsetzung habe ich vermutlich auch erst einmal genug zu tun. Eine elegantere Verarbeitung der Daten müsste dann in einem zweiten Schritt verfolgen, zumal ich in dieser Zeit auch viel nachlesen muss.
    Mit einer verbesserten Datenverarbeitung bin ich noch überfordert.
    Eure Meinung zu diesem Vorgehen würde mich interessieren.

    egon schrieb:

    Codverwaltungssystem
    Bitteschön:
    CVS
    SVN
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!