Datenklasse für Drucken usw..

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datenklasse für Drucken usw..

    Moin moin

    Ich beziehe mich hier auf den letzten Beitrag von @VaporiZed
    Probleme mit dem Drucken von XML

    Ich habe mal versuch das umzusetzen und die Daten aus der XML Datei in eine Class zu bringen und dann weiter zuverarbeiten und ohne das DataGridView zu drucken.

    Mein Code ist noch etwas "unschön" ;( aber vielleicht habt ihr ja Tips wie ich das alles verbessern kann:

    Edit alten Code gelöscht
    Bilder
    • datenclass1.jpg

      431,26 kB, 963×663, 61 mal angesehen
    • druckClass-1.jpg

      350,63 kB, 1.086×889, 63 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Mit einem typisierten Dataset hättest du schon deine "Datenklassen". Ich glaube ein guter Zeipunkt um sich mal Serialisierung anzuschauen. Da kannst du ganz leicht von einer "DatenKlassenInstanz" was in eine XML packen, aber auch eine Instanz mit dem Inahlt der XML erzeugen.

    Zudem kommentierst du viel zu viel. Allein hier:
    ' Verzeichnis für App-Daten
    AppDataDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), DataFolder)
    ' Benutzerverzeichnis
    CurrentUserPath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
    ' Eigenschaft für den vollständigen Pfad zur Einstellungsdatei
    XmlFile = Path.Combine(AppDataDirectory, Filename)
    ' DatasetClima initialisieren
    DatasetClima = New DSClima()

    Da ist doch sofort und sogar eindeutig klar was abgeht. Abgesehen von dem hier: XmlFile, XmlFileName oder XmlFilePath wäre ein besserer Name, dann sind diese Kommentare komplett überflüssig. Kommentieren tut man, wenn was zu beachten ist, also wenn auf was wichtiges hingewiesen werden muss. Auch wenn etwas nicht auf Anhieb eindeutig und leicht zu erkennen ist. Wählt man alle Namen passend aus und hält dem Code einfach, kommt das lesen des Codes dem lesen einer kleinen Geschichte gleich. Da muss man dann nicht zwischen den Zeilen lesen.(Zwischen den Zeilen lesen um einen Kontext/Zusammenhang zu erkennen, so nannte das damals mein Deutsch-Lehrer) Passt ja mit zwischen den Zeilen Lesen hier wie Po auf Eimer, Kommentare sind ja keine Codezeilen :D
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    @DTF

    Danke erstmal. ;)
    Zu dem Kommentieren, da wurde uns mal gesagt, lieber mehr als zu weinig Kommentare schreiben.
    Ich habe nun einen Ansatz mit dem "Serialisieren" fertig und mein Kopf schlägt gerade Purzelbäume. :(

    Soweit funktioniert dieser Code. Daten kommen ins DGV, ich kann ändern und speichern.
    Nur ist es so, in den bestehenden XMLs sind ja immer die Daten aller drei (3) Stationen drin. So wie ich gerade speichere, wird ja nur noch die ausgewählte Station gespeichert.

    Bevor ich nun weitermache, stellt sich die Frage:
    Mache ich wieder drei (3) separate DGVs oder nur ein DGV und dann nur die Daten der jeweiligen Station zuweisen? :?: :?:
    Würde das einen Unterschied in der Performance machen usw... wieder 100000² Fragen in meinem Kopf.... :S

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Xml.Serialization
    2. <Serializable>
    3. <XmlRoot("DSClima", Namespace:="http://tempuri.org/DSClima.xsd")>
    4. Public Class DSClima
    5. <XmlElement("Messwerte")>
    6. Public Property Messwerte As List(Of Messwerte)
    7. End Class
    8. <Serializable>
    9. Public Class Messwerte
    10. Public Property ID As Integer
    11. Public Property Station As Integer
    12. Public Property Datum As DateTime
    13. Public Property Temperatur1 As Decimal
    14. Public Property Temperatur2 As Decimal
    15. Public Property Temperatur3 As Decimal
    16. Public Property Humidity1 As Decimal
    17. Public Property Humidity2 As Decimal
    18. Public Property Humidity3 As Decimal
    19. Public Property Notizen As String
    20. End Class
    21. Imports System.Xml.Serialization
    22. Public Class LoadData
    23. ' Instanz von DSClima, die die geladenen Daten enthält
    24. Private Shared DsClimaInstance As DSClima
    25. ' Öffentliche Eigenschaft zum Zugriff auf die Singleton-Instanz
    26. Public Shared ReadOnly Property Instance As New LoadData()
    27. Public Function GetMesswerte() As List(Of Messwerte)
    28. Return If(DsClimaInstance IsNot Nothing, DsClimaInstance.Messwerte, New List(Of Messwerte)())
    29. End Function
    30. Public Sub LoadfromXml()
    31. Try
    32. Dim serializer As New XmlSerializer(GetType(DSClima))
    33. '' Testdatei laden
    34. Using reader As New StreamReader("A:\HC_05_2024.xml")
    35. DsClimaInstance = CType(serializer.Deserialize(reader), DSClima)
    36. End Using
    37. ' Debug-Ausgabe zur Überprüfung, ob die Daten korrekt geladen wurden
    38. 'For Each messwert In DsClimaInstance.Messwerte
    39. ' Debug.WriteLine($"ID: {messwert.ID}, Station: {messwert.Station}, Datum: {messwert.Datum}")
    40. ' Debug.WriteLine($"Temperatur1: {messwert.Temperatur1}, Temperatur2: {messwert.Temperatur2}, Temperatur3: {messwert.Temperatur3}")
    41. ' Debug.WriteLine($"Humidity1: {messwert.Humidity1}, Humidity2: {messwert.Humidity2}, Humidity3: {messwert.Humidity3}")
    42. ' Debug.WriteLine($"Notizen: {messwert.Notizen}")
    43. 'Next
    44. Catch ex As InvalidOperationException
    45. Debug.WriteLine($"Fehler im XML-Dokument: {ex.Message}")
    46. If ex.InnerException IsNot Nothing Then
    47. Debug.WriteLine($"Inner Exception: {ex.InnerException.Message}")
    48. End If
    49. Catch ex As Exception
    50. Debug.WriteLine($"Ein unerwarteter Fehler ist aufgetreten: {ex.Message}")
    51. End Try
    52. End Sub
    53. Public Sub SaveToXml()
    54. Try
    55. Dim serializer As New XmlSerializer(GetType(DSClima))
    56. Using writer As New StreamWriter("A:\HC_05_2024.xml")
    57. serializer.Serialize(writer, DsClimaInstance)
    58. End Using
    59. ' Debug-Ausgabe zur Überprüfung, ob die Daten korrekt gespeichert wurden
    60. Debug.WriteLine("Daten erfolgreich in die XML-Datei gespeichert.")
    61. Catch ex As InvalidOperationException
    62. Debug.WriteLine($"Fehler beim Speichern im XML-Dokument: {ex.Message}")
    63. If ex.InnerException IsNot Nothing Then
    64. Debug.WriteLine($"Inner Exception: {ex.InnerException.Message}")
    65. End If
    66. Catch ex As Exception
    67. Debug.WriteLine($"Ein unerwarteter Fehler ist aufgetreten: {ex.Message}")
    68. End Try
    69. End Sub
    70. Public Sub UpdateMesswerte(messwerte As List(Of Messwerte))
    71. If DsClimaInstance IsNot Nothing Then
    72. DsClimaInstance.Messwerte = messwerte
    73. End If
    74. End Sub
    75. End Class


    MainForm:

    VB.NET-Quellcode

    1. Public Class FrmMain
    2. ' Zugriff auf die Singelton Class
    3. Private ReadOnly LoadDataInstance As LoadData = LoadData.Instance
    4. ' DataTable zur Datenbindung
    5. Private messwerteTable As DataTable
    6. Public Sub New()
    7. InitializeComponent()
    8. LoadDataInstance.LoadfromXml()
    9. End Sub
    10. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    11. LoadDataToDataGridView(1) 'Station ID
    12. End Sub
    13. Private Sub LoadDataToDataGridView(station As Integer)
    14. ' Daten abrufen
    15. Dim messwerteList As List(Of Messwerte) = LoadDataInstance.GetMesswerte()
    16. ' DataTable initialisieren
    17. messwerteTable = New DataTable()
    18. ' Datenzeilen hinzufügen
    19. For Each messwert As Messwerte In messwerteList
    20. ' Prüfen, ob der Messwert zur gewünschten Station gehört
    21. If messwert.Station = station Then
    22. ' Neue Zeile in der DataGridView hinzufügen
    23. Dim rowIndex As Integer = DgvStation1.Rows.Add()
    24. Dim row As DataGridViewRow = DgvStation1.Rows(rowIndex)
    25. row.Cells("Datum").Value = messwert.Datum
    26. row.Cells("Temperatur1").Value = messwert.Temperatur1
    27. row.Cells("Temperatur2").Value = messwert.Temperatur2
    28. row.Cells("Temperatur3").Value = messwert.Temperatur3
    29. row.Cells("Humidity1").Value = messwert.Humidity1
    30. row.Cells("Humidity2").Value = messwert.Humidity2
    31. row.Cells("Humidity3").Value = messwert.Humidity3
    32. row.Cells("Notizen").Value = messwert.Notizen
    33. row.Cells("Station").Value = messwert.Station
    34. End If
    35. Next
    36. End Sub
    37. Private Sub SaveDataFromDataGridView()
    38. ' Liste von Messwerte initialisieren
    39. Dim messwerteList As New List(Of Messwerte)()
    40. ' Daten aus DataGridView abrufen
    41. For Each row As DataGridViewRow In DgvStation1.Rows
    42. If Not row.IsNewRow Then
    43. Dim messwert As New Messwerte With {
    44. .Datum = Convert.ToDateTime(row.Cells("Datum").Value),
    45. .Temperatur1 = Convert.ToDecimal(row.Cells("Temperatur1").Value),
    46. .Temperatur2 = Convert.ToDecimal(row.Cells("Temperatur2").Value),
    47. .Temperatur3 = Convert.ToDecimal(row.Cells("Temperatur3").Value),
    48. .Humidity1 = Convert.ToDecimal(row.Cells("Humidity1").Value),
    49. .Humidity2 = Convert.ToDecimal(row.Cells("Humidity2").Value),
    50. .Humidity3 = Convert.ToDecimal(row.Cells("Humidity3").Value),
    51. .Notizen = Convert.ToString(row.Cells("Notizen").Value),
    52. .Station = Convert.ToInt32(row.Cells("Station").Value)
    53. }
    54. messwerteList.Add(messwert)
    55. End If
    56. Next
    57. ' Daten aktualisieren und speichern
    58. LoadDataInstance.UpdateMesswerte(messwerteList)
    59. LoadDataInstance.SaveToXml()
    60. End Sub
    61. ' Beispiel-Button zum Speichern der Änderungen
    62. Private Sub BtnSave_Click(sender As Object, e As EventArgs) Handles BtnSave.Click
    63. SaveDataFromDataGridView()
    64. MessageBox.Show("Daten wurden gespeichert.")
    65. End Sub

    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ich finde Kommentare kosten Geld. Wird jede Zeile kommentiert brauchste nahezu doppelt so lange zum tippen,
    Edit:
    Ich relativiere, es dauert deutlich länger

    was bedeutet die Produktion wird teurer. Wenn nun z.B. Firma X/Behörde Y eine öffentliche Auschreibung macht, bekommt der günstigste den Zuschlag. Was glaubst du würde dein Chef von dir fordern damit ihr in so einem knallharten Konkurenzkampf bestehen könnt? Flotte produktion oder unnötig dokumentierten Code?
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()

    Ich glaube ich habe in meinen Programmen (ca. 100) insgesamt zwei oder drei Kommentare, in erster Linie, weil sich externe Komponenten anders verhalten, als ich es erwarten würde. Ansonsten lasse ich meinen Code für sich sprechen. Und wenn sich das Gedicht nicht reimt (also der Code Dinge erzählt, die so nicht nachvollziehbar sind), ändere ich den Code, bis ich über ihn nicht mehr angestrengt nachdenken muss, was er bedeutet. Also quasi: Ich schreibe nicht an »Ulysses« oder »Steppenwolf«, sondern an Kindergedichten.

    Amelie schrieb:

    ' Neue Zeile in der DataGridView hinzufügen
    Wieso werden neue Zeilen in ein DGV eingeführt?
    Datei -> Rohdaten -> eigene Klasseninstanzen -> BindingSource -> DGV
    Dann kommen also neue Daten in eine Liste von eigenen Klassendaten, ggf. noch Bindings der BindingSource aktualisieren (DeineBindingSource.ResetBindings(False)) und fertig ist der Lack. Ich käme nicht auf die Idee, nem DGV manuell per Code Zeilen hinzuzufügen. Ok, gelogen. Für eine Verkaufsstatistik habe ich ein DGV-Design missbraucht, um es so darzustellen, wie der Nutzer es wollte. Aber sonst läuft alles bei mir über die zuständige BindingSource.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    DTF schrieb:

    Flotte produktion oder unnötig dokumentierten Code?


    Puh, da bin ich gänzlich anderer Meinung. Kommentare müssen sein und die Zeit auch.
    Der Code kann noch so gut selbstdokumentierend sein, aber manchmal trifft man Entscheidungen, für die man sich auch nur Wochen später selber erschlagen könnte.

    Wenn die Leute, die ich anstelle keine Kommentare schreiben, wird das bestellte Produkt direkt wieder zurückgegeben
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    siycah schrieb:

    Kommentare müssen sein und die Zeit auch.


    Um Gottes willen. Ich sage ja nicht das Kommentare gänzlich unnötig sind. Ich kommentiere wenn nicht beim lesen sofort und eindeutig klar ist was passiert, nur weil ich weis was da genau passiert, darf man nicht erwarten das es ein anderer auch sofort erkennt, ich finde da muss man durchaus eine Balance finden. Amelie hat jedenfalls viel zu viele Kommentare finde ich. Es macht durchaus einen riesen Unterschied on man wirklich jede Zeile Kommentiert, wenn "var = System.IO.File.ReallAllText" kommentiert wird ist das unnötig.

    Es hängt aber auch vom ProjektTyp ab. Will jemand eine Bibliothek, kommt man nicht drumrum viel zu Dokumentieren, zumindest was die Funktionen etc. angeht. Da macht es noch mehr Sinn, wegen Intellisense, aber jede Codezeile, Naja.

    Jetzt im nachhinein glaub ich die Aussage das es nahezu doppelt so lange dauert ein wenig übertrieben war, aber es dauert deutlich länger.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „DTF“ ()

    Moin moin

    Ja irgendwo sehe ich ja ein das ich ggf zuviele Kommentare schreibe. Ich bemühe mich um Besserung und eine Balance zu finden. :)

    Zum Problem mit den Daten usw..
    Hatte nun versucht diese in ein (1) DGV zu bringen und zu speichern, und siehe da... schon das nächste Problem.
    Das speichern lief nicht so wie es soll. Mal wurden Teile der Daten nicht erneut mitgespeichert, mal wurden geänderte Daten einfach in der XML angehangen und nicht geändert.

    Bin gerade mal wieder an einem Punkt, wo mit das ganze so "unlogisch" erscheint. <X


    ​Datei -> Rohdaten -> eigene Klasseninstanzen -> BindingSource -> DGV
    Den Schritt hatte ich versucht. Aus den Daten wurde dann "Station1" schön geladen und Station2 und Station3 hageltes es Fehler... die ich einfach nicht verstehe.

    Die Daten in der XML Datei sind 100% Identisch...

    Werde mal das ganze Konzept neu überdenken. <X :/
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    und Station2 und Station3 hageltes es Fehler
    Bitte Code und Ergebnis zeigen. Und nicht bei Fehlern nicht gleich Sand in den Kopf stecken. Wenn es an einer Stelle klappt und an anderer nicht, dann sollte die Ursache gefunden werden, Stichwort RCA.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Kopf aus dem Sand .... ^^
    Habe nun etwas geschafft. Ob das alles so "gut" und "richtig" ist... :/ :?:

    Habe das Projekt mal mit einer Test-XML-Datei angehangen. (ohne bin/obj)
    Ein großes Problem war, das mit dem Drucken. Erst hatte ich das Problem, das ein erstes speichern klappte und sobald ich die Druckvorschau aufrief ging das speichern nicht mehr.
    Daraufhin habe ich fürs drucken eine separate Load-Class gemacht.
    Das funktioniert zwar nun, aber das ist denke ich so nicht richtig?

    Bin für jede Hilfe Dankbar. :)
    Bilder
    • bericht1.jpg

      105,05 kB, 1.035×423, 32 mal angesehen
    Dateien
    • HomeClimaXT.zip

      (666,68 kB, 34 mal heruntergeladen, zuletzt: )
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Ich find das komisch, dass du das DatenFile in eine selbstgebastelte Klasse deserialisierst, und die selbstgebastelte Klasse dann in eine DataTable überträgst, die dann einer BindingSource zuweist, woraus sich letztendlich alle DGV befüllen.
    Stattdessen habich deine DataTable in einem Dataset angelegt. Der Umweg über die Serialisierung und das Konvertieren in die Selbstbastel-Klasse ist damit üflüssig.
    Laden und Speichern vereinfacht sich dadurch wie folgt:

    VB.NET-Quellcode

    1. Public Sub LoadfromXml()
    2. Bindings.Instance.Dts.ReadXml(XmlName)
    3. End Sub
    4. Public Sub SaveMesswerte()
    5. Bindings.Instance.Dts.WriteXml(XmlName)
    6. End Sub

    Da nun die Daten direkt von der DataTable gelesen werden braucht man die selbstgebastelten DatenKlassen überhaupt nicht mehr - auch nicht fürs Drucken.
    Und den PrintHelper auch nicht.

    Fragt sich nun die Frage: Bist du dir sicher, dass du die Klassen LoadData und SaveDatas noch brauchst?
    Darin ist jeweils nur eine Methode, mit jeweils nur einer Zeile Code.
    Dateien
    • HomeClimaXE00.zip

      (30,65 kB, 42 mal heruntergeladen, zuletzt: )

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

    @ErfinderDesRades

    Erstmal Danke für die Arbeit. :) :)
    1.) Ein Fehler den ich bekomme ist, wenn in der XML noch "NullWerte" sind. Da muss ich wohl noch eine Prüfung einbauen. Mit einer XML aus Monat Mai (Vollständig) klappt es ;)
    Auch das Drucken etc funktioniert ohne die "extra" Class.

    2.) Den Rest, den Du umgebaut hast muss ich mal analysieren. Das mit dem DataSet, habe ich in meiner alten Version auch. Die Version mit der "Datenklasse" usw, wollte ich einfach mal machen, um zu verstehen wie das alles so funktioniert.
    Wenn ich so, wie in der alten Version meines Programmes, mehr oder weniger alles mit dem Designer zusammenklicke, verstehe ich nicht was da eigentlich passiert.
    Wobei der Code in meiner alten Version ist dann auch noch mehr als das was du gemacht hast. Muss ich mal vergleichen.


    Das mit den "kurzen" Klassen hat folgenden Grund.
    In einem Artikel las ich mal, und YT-Video und das wurde uns auch so in der Schule mal gesagt:
    ​Jede Klasse soll nur eine Ausgabe haben. Klassen und Methoden kurz halten. 20-30 Zeilen..... usw...

    Das habe ich nie so richtig kapiert, weil es oft (meine Meinung) zu unnötig vielen einzelnen Dateien kommt, die wiederum mit einander verknüpft werden müssen.
    Das macht mir zu schaffen und führt oft zu einem "wirren Code" :S


    Was wäre zum Beispiel hier so schlimm? Das sollte dann nach deren Aussage in 2 Klassen getrennt sein.

    VB.NET-Quellcode

    1. Public Class LoadSaveData
    2. Public Shared ReadOnly Property Instance As New LoadSaveData()
    3. Private ReadOnly BindingInstance As Bindings = Bindings.Instance
    4. Private ReadOnly LoadDataInstance As LoadData = LoadData.Instance
    5. Private Property XmlName As String = BindingInstance.TestFilename
    6. Public Sub LoadfromXml()
    7. Bindings.Instance.Dts.ReadXml(XmlName)
    8. End Sub
    9. Public Sub SaveMesswerte()
    10. Bindings.Instance.Dts.WriteXml(XmlName)
    11. End Sub
    12. End Class
    Bilder
    • edr_failure1.jpg

      247,48 kB, 828×414, 22 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Jede Klasse soll nur eine Ausgabe haben
    Die Aussage versteh ich nicht. Ach Moment, bestimmt Schreibfehler. Soll bestimmt heißen: »Jede Klasse sollte nur eine Aufgabe haben.«
    Eine Klasse, die zwischen Programm und Datei Daten transferiert, ist m.E. eine Klasse mit einer Aufgabe: Rohdatentransfer. Die aufzuteilen, sodass eine Klasse die Daten speichert und eine Klasse die Daten lädt, ist m.E. nicht sinnvoll, v.a., wenn es um dieselbe Datei geht.
    Wenn eine Klasse die Daten aus einer XML-Datei lädt und zum anderen die Daten in einer PDF-Datei als Ausdruck speichert, dann sind das zwei Aufgaben, weil es einmal um Rohdatenimport und um formatierte/aufbereitete Ausgabe geht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    Ja ich stimme dir zu, wenn es um den Daten-Import und dann das spätere Ausdrucken etc. geht.

    Aber Die Rohdaten aus der XML laden und wieder reinschreiben (speichern), finde ich kann doch in eine Class :?:
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Genau das meinte ich auch. Das ist die Aufgabe von einer Klasse, nicht die von zweien.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Amelie schrieb:

    Jede Klasse soll nur eine Aufgabe haben.
    "Aufgabe" ist das falsche Wort.
    In der Literatur spricht man von "concern", was man glaub in diesem Zusammenhang mit "Zuständigkeit" übersetzt.
    Und eine Zuständigkeit umfasst meist mehrere Aufgaben.
    Und das ist eine Sache von Augenmass, welche Aufgaben man einer Zuständigkeit zuweist.
    VPZ hat grade der Zuständigkeit "RohdatenTransfer" die Aufgaben Laden und Speichern zugewiesen - den PDF-Ausdruck aber nicht.
    Kann man machen, kann man aber auch anders machen - wie gesagt: da gibt es kein Rezept.

    Auch das hier:

    Amelie schrieb:

    Klassen und Methoden kurz halten. 20-30 Zeilen...
    ist ein bischen falsch/ungenau, und ist auch eine Augenmass-Sache.
    Also richtiger wäre:
    • Klasse/Datei: ca. 50 - 300 Zeilen
      sowohl zu kleine Dateien als auch zu grosse sind unübersichtlich.
      Manchmal ergeben sich Winz-Klassen, dann packe ich mehrere davon in eine Datei (wie du es zB mit Messwerte.vb gemacht hast)
    • Methode: ca. 3 - 30 Zeilen
      auf jeden Fall, wenn etwas > 2 Zeilen mehrfach vorkommt: Methode draus machen.
      Und hier gilt tatsächlich: Eine Methode soll nur eine Aufgabe haben.



    Und nochwas: Klasse ist ein OOP-Element, was vom Grundsatz her dazu da ist, das es mehrere Objekte davon gibt, die sich inhaltlich unterscheiden.
    ZB du hast drei Objekte der Klasse Auto, und die haben verschiedene Farben. Farbe wäre hier der Inhalt, der in Auto mittels einer KlassenVariable gemerkt wird.
    Wenn du Klassen baust, von denen es prinzipiell nur ein Objekt geben soll, oder die/das Objekt der Klasse hat überhaupt keinen Inhalt (keine KlassenVariablen) - dann läuft höchstwahrscheinlich etwas schief und ein besseres Design ist denkbar.





    Amelie schrieb:

    Ein Fehler den ich bekomme ist, wenn in der XML noch "NullWerte" sind. Da muss ich wohl noch eine Prüfung einbauen.
    Besser wäre, du würdest die NullWerte aus dem Xml entfernen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades

    OK, Zuständigkeiten usw verstanden ;)


    ​Besser wäre, du würdest die NullWerte aus dem Xml entfernen.


    Damit ärgere ich mich gerade herum.

    Beispiel:

    XML-Quellcode

    1. <Messwerte>
    2. <ID>1</ID>
    3. <Station>1</Station>
    4. <Datum>2024-06-01T00:00:00</Datum>
    5. <Temperatur1>21.2</Temperatur1>
    6. <Temperatur2></Temperatur2>
    7. <Temperatur3></Temperatur3>
    8. <Humidity1>59</Humidity1>
    9. <Humidity2></Humidity2>
    10. <Humidity3></Humidity3>
    11. <Notizen>Lorem Ipsum</Notizen>
    12. </Messwerte>


    Wenn da noch nichts eingegeben wurde ist das "leer" weil eben noch NICHTS zum eingeben da ist.

    Und in der PrinterClass hauts mir hier ständig einen Fehler. Ich drehe noch durch...
    Seltsamerweise funktionierte das mit der Class Messdaten usw...

    VB.NET-Quellcode

    1. Private Sub DrawColoredTemperatureCell(graphics As Graphics, value As Object, font As Font, x As Single, y As Single, width As Integer, height As Integer)
    2. Dim brush As New SolidBrush(Color.Black)
    3. If Not IsDBNull(value) AndAlso Decimal.TryParse(Convert.ToString(value), New Decimal) Then
    4. Dim tempValue As Double = Convert.ToDecimal(value)
    5. If tempValue < 18 Then
    6. brush.Color = Color.Blue
    7. ElseIf tempValue <= 21 Then
    8. brush.Color = Color.DarkOrange
    9. ElseIf tempValue <= 24 Then
    10. brush.Color = Color.Green
    11. Else
    12. brush.Color = Color.Red
    13. End If
    14. graphics.DrawRectangle(Pens.Gray, x, y, width, height)
    15. graphics.DrawString(tempValue.ToString("N1") & " °C", font, brush, x, y)
    16. Else
    17. ' Behandlung, wenn der Wert DBNull ist oder die Konvertierung fehlschlägt
    18. graphics.DrawRectangle(Pens.Gray, x, y, width, height)
    19. End If
    20. End Sub
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    in der PrinterClass hauts mir hier ständig einen Fehler
    Bei welchem Code kommt welche genaue Fehlermeldung?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    ​Eine Ausnahme vom Typ "System.Data.ConstraintException" ist in System.Data.dll aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet. Einschränkungen konnten nicht aktiviert werden. Mindestens eine Zeile enthält Werte die die Einschränkungen non-null, unique or foreign-key verletzen.

    Kommt bei dem Zip von EdR.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Also das Ding aus Post#12, ok. Dann müsstest Du überlegen, welche Situation Dir mehr taugt: Du belässt es bei fix 3 Werten pro Tag, dann musst Du im tDS (typisiertem DataSet) einstellen, dass NULL-Werte für jene Werte erlaubt sein dürfen, um zu erkennen/hinterlegen, dass noch kein Messwert vorliegt. Die Erlaubnis für NULL-Werte schaltet EdR immer ab, da für ihn NULL-Werte im tDS nix zu suchen haben. AFAIK. Oder Du stellst es so um, dass Du keine fixe Anzahl von Messwerten pro Tag hast, sondern eine weitere Tabelle machst, in der die Messwerte und die Tages- und Tageszeitzuordnung hinterlegt werden. In der Tabelle eräbe es keinen Sinn, dass NULL-Werte existieren. Das musst Du entscheiden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.