Hilfe beim Umbau eines Programmes

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

Es gibt 57 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Amelie schrieb:

    Bei zwei DataTable hätte ich also das DT-Weather mit der "ID" welche mit der neuen "MonthID" im DT-Month gebunden wäre?
    Hier stehe ich grade auf dem Schlauch ...
    In "DT-Month" wird immer der jeweilige Monat und das Jahr ( was vom Code kommt ) gespeichert und das dann mit der "MonthID" der "DT-Weather" verknüpft?
    Jo, das habich nun schon zweimal versucht dir zu sagen - auf ein neues:

    ErfinderDesRades schrieb:

    Dann sieht man auf den ersten Blick, dass die PK-Spalte Month.ID verknüpft ist mit der FK-Spalte Weather.MonthID
    Month.ID, Weather.MonthID - das ist ganz wörtlich gemeint - so sollen die Spalten heissen. Ich weiss nicht, was es daran auffm Schlauch zu stehen gibt.
    (einfach mal machen, was ich vorschlage)



    Vaporized bringt nun einen neuen Ansatz ins Spiel, wo die Strukturierung der Daten in Monate entfällt.
    Stattdessen kann man was mit Filter-Ausdrücken machen.

    Geht auch - ist aber quasi eine andere Anwendung.
    Ist vlt. im konkreten Fall auch einfacher.
    Insbesondere kannste dich nochmal davor drücken, endlich mal Datenmodellierung zu erlernen.

    Du musst dich da entscheiden:
    1. Willst du die Monats-Ansichten in einem strukturierten Datenmodell abbilden?
    2. Oder willst du Monats-Ansichten erzeugen, indem du mit String-Operationen Filter-Ausdrücke zusammenstöpselt?

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

    @ErfinderDesRades
    ​einfach mal machen, was ich vorschlage

    Ich mache ja ;)
    ​daran auffm Schlauch zu stehen gibt

    Naja was für Euch "Normneuros" einfach ist, ist für uns "Autisten" oft nicht so einsehbar. Wir brauchen für mache Sachen eben etwas länger.

    ​Geht auch - ist aber quasi eine andere Anwendung.

    Naja die erste Version, womit Opa gerade arbeitet ist auch ganz anders. Wie du schon sagtes sehr sehr Oldschool aber es funktioniert, mit Schwächen.
    Klar den Code davon darf ich nicht zeigen *biggrins*
    Deswegen wollte ich es ja nochmal machen. Muss halt nur dabei beachten das ich die "alten Daten" wieder einlesen kann.
    Und vor allem das die Berechnungen ( Monats / Jahres - Durchschnitte ) funktionieren. :)

    --------------------
    1 oder 2 ?? Beides ;)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Ich mache ja ;) )
    Du machst ja nicht.
    Ich sage: "Verknüpfe PK-Spalte Month.ID mit der FK-Spalte Weather.MonthID" - (ich sage das nu zum 4. Mal.)
    Und was machst du? Du verknüpfst PK-Spalte Month.ID mit PK-Spalte Weather.ID.
    Was also meinst du, wenn du sagst "Ich mach ja"?

    Amelie schrieb:


    1 oder 2 ?? Beides ;)
    Sorry, dassis quatsch.
    Du kannst entweder Eisenbahn fahren oder mit dem Auto. "Beides" is quatsch.
    Das sind bei mir keine beliebigen Sprüche, sondern ich meine es auch so, wenn ich sag, du musst dich für eine Vorgehensweise entscheiden.

    Amelie schrieb:


    Naja was für Euch "Normneuros" einfach ist, ist für uns "Autisten" oft nicht so einsehbar. Wir brauchen für mache Sachen eben etwas länger.

    Ich finde es falsch das als Problem von Autismus zu generalisieren; ich bin sicher es gibt einige Autisten, für die ist eine Programmiersprache die Muttersprache.
    Und das bei sowas Menschen außerhalb des Spektrums auf dem Schlauch stehen können, kann ich aus erster Hand berichten.

    Ich musste erstmal die richtigen Fragen stellen, bevor ich mit Datenmodellen irgendwas anfangen konnte.

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

    @Haudruferzappeltnoch
    Ich spreche hier nicht für alle Autisten sondern für mich! Sorry wenn es "allgemein klang". Mag sein das das programmieren für einige quasi im Schlaf geht für MICH leider nicht! Und wie du selber schriebst ist es für jeden anderen auch nicht so einfach das mit den Datenmodellen etc. zu verstehen. Zumal es zwar zig Quellen im WWW / Bücher gibt, aber da doch oft völlig andere Herangehensweisen vorgeschlagen werden. "Verwirrung"

    @ErfinderDesRades
    Ich weis was ich tun sollte und ich versuche es ja umzusetzen. Mag sein das Dir meine Geschwindigkeit, etwas zu begreifen / umzusetzen etwas schwer fällt, aber ich kann es nicht ändern. :(

    ​Du kannst entweder ...oder... "Beides" is quatsch.

    Für meine Logik nicht. Ich kann mit dem Auto zum Bahnhof fahren und dann weiter mit dem Zug.

    Aber wieder zum Thema.
    Sicher haben beide Ansätze Vor und Nachteile, welche ich nicht einschätzen kann. Aber nach meinem jetzigen "können", wäre es da nicht einfacher erstmal das "leichtere" zu lernen in Sachen "Datenverarbeitung" was ich für mein kleines Programm benötige? Ich schrieb ja, das ich gerade Fortschritte in Sachen OOP mache und darüber echt froh bin, das dass klappt.

    Also weiter und Übungsprojekt wieder umbauen. :rolleyes:
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Für meine Logik nicht. Ich kann mit dem Auto zum Bahnhof fahren und dann weiter mit dem Zug.
    also nacheinander - Ja, das kannste machen:
    Erst die Anwendung schreiben mit einem strukturierten Datenmodell, und dann die Anwendung schreiben mit nur einer Tabelle, zuzüglich geeigneter Filter-Logik.
    Entscheiden musste dich trotzdem: Was möchtest du als erstes anfangen?
    Mit "Beides" kannste nicht anfangen.
    @ErfinderDesRades
    Mit "Beides" kannste nicht anfangen.


    Das ist "fast" wahr... :D

    Also ich würde mit dem leichteren beginnen, um auch noch etwas mit den Klassen zu üben. :)
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @VaporiZed @ErfinderDesRades

    Ich habe nun mal etwas mit dem neuen DT`s usw versucht.
    Ich bekomme zwar Einträge hin, noch nicht ganz so wie es sollte, aber wird die XML-Datei dann letztendlich nicht irgendwann sehr groß und das einlesen demzufolge sehr langsam? ?(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Nun ich habe mal geschaut. Bei den einzelnen MonatsXML sind es im Schnitt 25-30kb pro Datei, wobei da noch nicht alle Daten eingegeben sind.
    Wenn das dann alles in eine einzige geschrieben wird ... ?(
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    @ErfinderDesRades @VaporiZed

    Moin moin

    Habe nun etwas gemacht. Einige alte XML-Dateien zusammengebaut zu einer einzigen.
    Dann das DS/DT ( siehe Bild ) erstellt und das DGV auf die Form..

    Wäre das so in Eurem Sinne??


    Spoiler anzeigen

    Klasse für das Datum zu blättern

    VB.NET-Quellcode

    1. Public Class DateService
    2. Private _currentMonth As Integer = DateTime.Now.Month
    3. Private _currentYear As Integer = DateTime.Now.Year
    4. Public Property CurrentMonth As Integer
    5. Get
    6. Return _currentMonth
    7. End Get
    8. Set(value As Integer)
    9. ' Überprüfen und behandeln des Überlaufs
    10. If value < 1 Then
    11. _currentMonth = 12 ' Zum Dezember des Vorjahres springen
    12. _currentYear -= 1 ' Jahr entsprechend anpassen
    13. ElseIf value > 12 Then
    14. _currentMonth = 1 ' Zum Januar des Folgejahres springen
    15. _currentYear += 1 ' Jahr entsprechend anpassen
    16. Else
    17. _currentMonth = value
    18. End If
    19. End Set
    20. End Property
    21. Public Property CurrentYear As Integer
    22. Get
    23. Return _currentYear
    24. End Get
    25. Set(value As Integer)
    26. _currentYear = value
    27. End Set
    28. End Property
    29. Public Sub NextMonth()
    30. CurrentMonth += 1
    31. End Sub
    32. Public Sub PreviousMonth()
    33. CurrentMonth -= 1
    34. End Sub
    35. Public Function GetFormattedMonth() As String
    36. Dim monthName As String = DateTimeFormatInfo.CurrentInfo.GetMonthName(CurrentMonth)
    37. Return $"{monthName} {_currentYear}"
    38. End Function
    39. End Class


    Das Mainform (wird noch verbessert :) )

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Public WithEvents _dateService As New DateService
    3. Public WithEvents _xmlService As New XmlService()
    4. Public Sub New()
    5. InitializeComponent()
    6. ToollblDatum.Text = _dateService.GetFormattedMonth()
    7. End Sub
    8. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. LoadMonth(_dateService.CurrentMonth)
    10. End Sub
    11. Private Sub ToolbtnNextMonth_Click(sender As Object, e As EventArgs) Handles ToolbtnNextMonth.Click
    12. _dateService.NextMonth()
    13. ToollblDatum.Text = _dateService.GetFormattedMonth()
    14. LoadMonth(_dateService.CurrentMonth)
    15. End Sub
    16. Private Sub ToolbtnPrevMonth_Click(sender As Object, e As EventArgs) Handles ToolbtnPrevMonth.Click
    17. _dateService.PreviousMonth()
    18. ToollblDatum.Text = _dateService.GetFormattedMonth()
    19. LoadMonth(_dateService.CurrentMonth)
    20. End Sub
    21. Private Sub LoadMonth(searchmonth As Integer)
    22. ' Den aktuellen Monat bestimmen und Daten laden
    23. Dim year As Integer = _dateService.CurrentYear
    24. Dim month As Integer = searchmonth
    25. Dim dtWeather As DataTable = DsWeather.Tables("dtWeather")
    26. _xmlService.ReadXMLFile(DsWeather)
    27. ' Filtern der Daten für den aktuellen Monat
    28. dtWeather.DefaultView.RowFilter = $"Monat ={month}"
    29. Debug.WriteLine($"Monat ={month}")
    30. ' Überprüfen, ob Datensätze vorhanden sind
    31. If dtWeather.DefaultView.Count > 0 Then
    32. ' Den Filter auf die DataView anwenden
    33. Dim dataView As New DataView(dtWeather)
    34. ' Den Filter auf die Zeilen mit Datum anwenden
    35. dataView.RowFilter = $"Monat = {month}"
    36. dgvWeather.DataSource = dataView
    37. dgvWeather.Columns(1).ReadOnly = True
    38. dgvWeather.AllowUserToAddRows = False
    39. Else
    40. ' Keine Daten vorhanden, später neuen Monat anlegen
    41. dgvWeather.DataSource = Nothing
    42. End If
    43. End Sub
    44. End Class


    Bilder
    • newdatatable.jpg

      149,24 kB, 739×508, 80 mal angesehen
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Jo, Dataset könnte so gehen.
    Natürlich hast du nachwievor den unsinnigen Prefix an der Tabelle, und ebenfalls sehr wichtig wäre, alle Spalten auf NotNull zu stellen, aber an Datenmodellierung bist du ja nicht interessiert.

    Ich glaube nicht, dass die Klasse DateService nötig ist - ich sehe da eiglich keine Logik, die nicht bereits von System.DateTime abgedeckt wäre.
    Ist ja erfreulich, dass du dich im Klassen programmieren einigermassen sicher fühlst, aber noch besser, als eine Klasse zu programmieren, ist es, das eben nicht zu tun, sondern die bestehenden Klassen einfach zu verwenden.

    Und wenn du nun alles in einem Dataset hast, dann musste dieses ja nur noch einmal laden, und nicht jedesmal neu, wenn auf einen der Buttons geklickst wird.
    Und zum Filtern nimm die BindingSource - bastel nicht iwas grumpeliges mit DataViews herum.
    Schrieb ich ja schon vor langem:
    Niemals eine im Designer eingerichtete Datasource zur Laufzeit austauschen!
    Das ist nicht nötig.
    Jetzt wieder eine Herausforderung an dich: Was ist bei dir im Designer als Datasource des dgvs eingerichtet?
    @ErfinderDesRades

    Diesen "unsinnigen" Präfix brauche ich halt noch, um nicht durcheinander zu kommen.
    Das ich an "Datenmodelling" nicht interessiert bist stimmt ja nicht. Nur ich möchte eins nach dem anderen und erstmal das einfache "lernen". Zumal ich erst heute Nacht gelesen habe, das es in manchen Projekten auch "übertrieben" sein kann ein "großes Datenmodelling" zu machen. ?(

    Ebenso habe ich da auch das mit den "Filtern" gelesen. Deiner Aussage: ""bastel nicht iwas grumpeliges mit DataViews""
    War aber auch viel zu kompliziert mit "datum zwischen y und y " usw.. was ich dann auf den Filter "Monat" geändert habe und auch erstmal funktionierte!

    "dass die Klasse DateService nötig...."
    Für mich schon, weil ich es anders nicht hinbekommen habe. Ich kenne noch lange nicht alles was es schon "fertig oder halb-fertig" gibt.

    "als Datasource des dgvs" === > Da steht die "Bindingsource drin.

    Das mit der Bindingsource habe ich eh noch nicht so richtig verstanden.
    ------------------------------------------

    Naja, da ich mir das ganze eh grade zerschossen habe ... auf ein neues :S
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Amelie schrieb:

    Das mit der Bindingsource habe ich eh noch nicht so richtig verstanden.
    Dann nachfragen, bis klar ist, was es damit auf sich hat.
    Ich versuch's mal mit den Grundlagen: Du kannst bei einem DGV (oder anderem Datenansichtscontrol) direkt an eine Datenquelle wie eine List(Of EineKlasse) binden. Damit kannst Du die Propertys dieser Liste im Control sehen und deren Inhalt verändern. Also: Du siehst die Einträge der Liste z.B. im DGV.

    Die BindingSource (BS) ist ein zwischengeschobenes Konstrukt, was die Möglichkeiten des Datenzugriffs erweitert/verbessert.
    • Die BS nimmt selbst eine DataSource und fungiert als Datenquelle für ein Ansichtscontrol. Die Daten gehen also von: beliebige Datenquelle -> BS -> Ansichtscontrol
    • Die BS hat ein Current, was angibt, welches Element gerade aus der Datenquelle das aktuell gewählte ist. Du kannst diese Auswahl durch Selektion im Ansichtscontrol ändern als auch durch Festlegen der Positionseigenschaft der BS oder auch mit den Move-Methoden der BS
    • Die BS kann als Datenquelle auch nur einen Datentyp nehmen, damit schon im Designer, also zur Programmierzeit das Ansichtscontrol angepasst werden kann.
    Die BS kann noch einiges mehr, aber das sollte erstmal reichen, um den ersten Nutzen zu erkennen. Wenn weitere Fragen sind: her damit.
    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 @ErfinderDesRades

    So, habe nun nochmal gelesen und geändert...
    hier ein Auszug...Hoffe das ist so richtig. ?(

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Public WithEvents _dateService As New DateService
    3. Public WithEvents _xmlService As New XmlService
    4. Public Sub New()
    5. InitializeComponent()
    6. ToollblDatum.Text = _dateService.GetFormattedMonth()
    7. End Sub
    8. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. LoadData()
    10. End Sub
    11. Private Sub ToolbtnPrevMonth_Click(sender As Object, e As EventArgs) Handles ToolbtnPrevMonth.Click
    12. _dateService.PreviousMonth()
    13. ToollblDatum.Text = _dateService.GetFormattedMonth()
    14. FilterByMonth(_dateService.CurrentMonth)
    15. End Sub
    16. Private Sub LoadData()
    17. ' Den aktuellen Monat bestimmen und Daten laden
    18. Dim year As Integer = _dateService.CurrentYear
    19. Dim month As Integer = _dateService.CurrentMonth
    20. Dim dtWeather As DataTable = DsWeather.Tables("dtWeather")
    21. ' Deaktiviere die Einschränkungen für das DataSet
    22. DsWeather.EnforceConstraints = False
    23. Try
    24. _xmlService.ReadXMLFile(DsWeather)
    25. dgvWeather.DataSource = DtWeatherBindingSource
    26. dgvWeather.Columns(3).ReadOnly = True
    27. dgvWeather.AllowUserToAddRows = False
    28. ' Filter zurücksetzen
    29. DtWeatherBindingSource.RemoveFilter()
    30. ' Filtern nach dem aktuellen Monat
    31. FilterByMonth(month)
    32. Catch ex As Exception
    33. ' Behandle etwaige Ausnahmen beim Lesen der XML-Daten
    34. MessageBox.Show("Fehler beim Laden der Daten: " & ex.Message)
    35. End Try
    36. End Sub
    37. Private Sub FilterByMonth(month As Integer)
    38. Dim filterExpression As String = "Monat = " & month.ToString()
    39. DtWeatherBindingSource.Filter = filterExpression
    40. End Sub



    DsWeather.EnforceConstraints = False
    Warum bekomme ich Fehler wenn das auf True ist?
    ID sei schon vorhanden, ist aber keine doppelt!!
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

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

    Möchtest Du die XML mal hier hochladen, damit wir diese überprüfen können? Wenn das Programm sagt, dass die Einschränkungen nicht erfüllt werden können, das ist dem so. Der Computer lügt da nicht.

    VB.NET-Quellcode

    1. dgvWeather.DataSource = DtWeatherBindingSource
    2. dgvWeather.Columns(3).ReadOnly = True
    3. dgvWeather.AllowUserToAddRows = False
    Das sind Sachen, die Du im Designer einstellen solltest, nicht im Code - es sei denn, dass es einen Grund gibt, das zur Laufzeit zu ändern.

    Vielleicht ist das aber auch Teil des Problems. Wenn Du AllowUserToAddRows von Vornherein (oder zumindest vor Laden der XML) auf False schaltest, könnte es sein, dass das Problem nicht auftritt.
    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.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    @VaporiZed

    Moin moin
    Im Anhang die XML. Das Problem ist aber bis jetzt nach Änderung des Codes nicht mehr aufgetaucht.

    Ein Problem hier. Er springt immer in den ​If Not month....

    VB.NET-Quellcode

    1. Private Sub CheckMonth()
    2. Dim targetMonth As Integer = _dateService.CurrentMonth
    3. Dim monthExists As Boolean = False
    4. For Each row As DataRowView In DtWeatherBindingSource
    5. Dim month As Integer = CInt(row("Monat"))
    6. If month = targetMonth Then
    7. monthExists = True
    8. End If
    9. Next
    10. If Not monthExists Then
    11. CreateNewTable(_dateService.CurrentYear, _dateService.CurrentMonth)
    12. End If
    13. End Sub
    14. Private Sub ToolbtnNextMonth_Click(sender As Object, e As EventArgs) Handles ToolbtnNextMonth.Click
    15. _dateService.NextMonth()
    16. ToollblDatum.Text = _dateService.GetFormattedMonth()
    17. CheckMonth()
    18. FilterByMonth(_dateService.CurrentMonth)
    19. End Sub
    20. Private Sub ToolbtnPrevMonth_Click(sender As Object, e As EventArgs) Handles ToolbtnPrevMonth.Click
    21. _dateService.PreviousMonth()
    22. ToollblDatum.Text = _dateService.GetFormattedMonth()
    23. CheckMonth()
    24. FilterByMonth(_dateService.CurrentMonth)
    25. End Sub



    Das ganze MainForm:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class frmMain
    2. Public WithEvents _dateService As New DateService
    3. Public WithEvents _xmlService As New XmlService
    4. Public Sub New()
    5. InitializeComponent()
    6. ToollblDatum.Text = _dateService.GetFormattedMonth()
    7. End Sub
    8. Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. LoadData()
    10. End Sub
    11. Private Sub CheckMonth()
    12. Dim targetMonth As Integer = _dateService.CurrentMonth
    13. Dim monthExists As Boolean = False
    14. For Each row As DataRowView In DtWeatherBindingSource
    15. Dim month As Integer = CInt(row("Monat"))
    16. If month = targetMonth Then
    17. monthExists = True
    18. End If
    19. Next
    20. If Not monthExists Then
    21. CreateNewTable(_dateService.CurrentYear, _dateService.CurrentMonth)
    22. End If
    23. End Sub
    24. Private Sub ToolbtnNextMonth_Click(sender As Object, e As EventArgs) Handles ToolbtnNextMonth.Click
    25. _dateService.NextMonth()
    26. ToollblDatum.Text = _dateService.GetFormattedMonth()
    27. CheckMonth()
    28. FilterByMonth(_dateService.CurrentMonth)
    29. End Sub
    30. Private Sub ToolbtnPrevMonth_Click(sender As Object, e As EventArgs) Handles ToolbtnPrevMonth.Click
    31. _dateService.PreviousMonth()
    32. ToollblDatum.Text = _dateService.GetFormattedMonth()
    33. CheckMonth()
    34. FilterByMonth(_dateService.CurrentMonth)
    35. End Sub
    36. Private Sub LoadData()
    37. ' Den aktuellen Monat bestimmen und Daten laden
    38. Dim year As Integer = _dateService.CurrentYear
    39. Dim month As Integer = _dateService.CurrentMonth
    40. Dim dtWeather As DataTable = DsWeather.Tables("dtWeather")
    41. Try
    42. _xmlService.ReadXMLFile(DsWeather)
    43. dgvWeather.DataSource = DtWeatherBindingSource
    44. ' Filter zurücksetzen
    45. DtWeatherBindingSource.RemoveFilter()
    46. ' Filtern nach dem aktuellen Monat
    47. FilterByMonth(month)
    48. Catch ex As Exception
    49. ' Behandle etwaige Ausnahmen beim Lesen der XML-Daten
    50. MessageBox.Show("Fehler beim Laden der Daten: " & ex.Message)
    51. End Try
    52. End Sub
    53. Private Sub FilterByMonth(month As Integer)
    54. Dim filterExpression As String = "Monat = " & month.ToString()
    55. DtWeatherBindingSource.Filter = filterExpression
    56. End Sub
    57. Private Sub CreateNewTable(year As Integer, month As Integer)
    58. MessageBox.Show("CreateNewTable wurde aufgerufen. Jahr: " & year & ", Monat: " & month.ToString())
    59. Dim dtWeather As DataTable = DsWeather.Tables("dtWeather")
    60. ' Hinzufügen der neuen Zeilen für jeden Tag des Monats
    61. Dim daysInMonth As Integer = DateTime.DaysInMonth(year, month)
    62. For day As Integer = 1 To daysInMonth
    63. Dim sDay As String = $"{day:00}-{month:00}-{year}"
    64. Dim newRow As DataRow = dtWeather.NewRow()
    65. ' ID raus sonst Fehler beim zuweisen
    66. newRow("Jahr") = year
    67. newRow("Monat") = month
    68. newRow("Datum") = sDay
    69. newRow("WetterTag") = ""
    70. newRow("WetterNacht") = ""
    71. newRow("Regen24h") = 0.0
    72. newRow("SchneeTag") = 0.0
    73. newRow("SchneeNacht") = 0.0
    74. newRow("LuftfminTag") = 0.0
    75. newRow("LuftfmaxTag") = 0.0
    76. newRow("LuftfminNacht") = 0.0
    77. newRow("LuftfmaxNacht") = 0.0
    78. newRow("TempTag") = 0.0
    79. newRow("TempNacht") = 0.0
    80. newRow("WindTag") = 0.0
    81. newRow("WindNacht") = 0.0
    82. dtWeather.Rows.Add(newRow)
    83. Next
    84. End Sub
    85. Private Sub SaveToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SaveToolStripMenuItem.Click
    86. Dim year As Integer = _dateService.CurrentYear
    87. Dim month As Integer = _dateService.CurrentMonth
    88. ' Bestätigen die Änderungen im DataGridView
    89. DtWeatherBindingSource.EndEdit()
    90. ' Überprüfen ob das DataSet Daten enthält
    91. If DsWeather.Tables.Count > 0 AndAlso DsWeather.Tables(0).Rows.Count > 0 Then
    92. ' Speicher das DataSet
    93. _xmlService.SaveXMLFile(DsWeather)
    94. Else
    95. ' Das DataSet ist leer, es gibt keine Daten zum Speichern
    96. Debug.WriteLine("Leer")
    97. End If
    98. End Sub
    99. End Class

    Dateien
    • CGJahr.xml

      (16,81 kB, 84 mal heruntergeladen, zuletzt: )
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    VB.NET-Quellcode

    1. For Each row As DataRowView In DtWeatherBindingSource
    Das ist m.E. der falsche Anfang. Geh die DataTable direkt durch.

    VB.NET-Quellcode

    1. Dim dtWeather As DataTable = DsWeather.Tables("dtWeather")
    Bitte keine Strings für diese Aufgabe verwenden. Schreib einfach: Dim dtWeather = DsWeather.dtWeather. Dann hast Du eine typisierte DataTable - nämlich eine WeatherDataTable. Dann klappt das mit dem Zeilenhinzufügen ganz einfach: dtWeather.AdddtWeatherRow(hierGanzVieleParameter). Und dann brauchst Du das untypisierte Suchen von wegen

    VB.NET-Quellcode

    1. For day As Integer = 1 To daysInMonth
    2. Dim sDay As String = $"{day:00}-{month:00}-{year}"
    3. Dim newRow As DataRow = dtWeather.NewRow()
    4. ' ID raus sonst Fehler beim zuweisen
    5. newRow("Jahr") = year
    6. newRow("Monat") = month
    7. newRow("Datum") = sDay
    8. newRow("WetterTag") = ""
    9. newRow("WetterNacht") = ""
    10. newRow("Regen24h") = 0.0
    11. newRow("SchneeTag") = 0.0
    12. newRow("SchneeNacht") = 0.0
    13. newRow("LuftfminTag") = 0.0
    14. newRow("LuftfmaxTag") = 0.0
    15. newRow("LuftfminNacht") = 0.0
    16. newRow("LuftfmaxNacht") = 0.0
    17. newRow("TempTag") = 0.0
    18. newRow("TempNacht") = 0.0
    19. newRow("WindTag") = 0.0
    20. newRow("WindNacht") = 0.0
    21. dtWeather.Rows.Add(newRow)
    22. Next
    nicht. Dieser Codeblock ist dann komplett überflüssig.
    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.