Hallo zusammen.
Meine WetterApp nimm nun langsam die Formen an, welche gefordert sind.
Nun ist beim eingeben von realen Daten ein "Fehler" aufgetaucht.
Wenn man z.B. bei der ersten Eingabe, Daten falsch eingegebenen hat oder etwas vergessen hat, wir ein ZWEITER Eintrag mit selben Datum in die XML geschrieben. Siehe mein Code / Daten
Das ist natürlich nicht gut, weil so meine ganzen Diagramme etc nicht stimmen.
Wie kann ich nun auf einfachstem Wege, mein Eingabecode so abändern, das z.B. die XML eingelesen wird und dann ggf die Daten entweder neu geschrieben werden oder im Falle das ein Datensatz besteht, dieser "geändert" wird.
Von mir aus kann das "ändern" auch in einem separatem Form passieren.
Ich hoffe mir kann jemand eine "einfache" Hilfe dazu anbieten.
DANKE
Spoiler anzeigen
Meine WetterApp nimm nun langsam die Formen an, welche gefordert sind.
Nun ist beim eingeben von realen Daten ein "Fehler" aufgetaucht.
Wenn man z.B. bei der ersten Eingabe, Daten falsch eingegebenen hat oder etwas vergessen hat, wir ein ZWEITER Eintrag mit selben Datum in die XML geschrieben. Siehe mein Code / Daten
Das ist natürlich nicht gut, weil so meine ganzen Diagramme etc nicht stimmen.
Wie kann ich nun auf einfachstem Wege, mein Eingabecode so abändern, das z.B. die XML eingelesen wird und dann ggf die Daten entweder neu geschrieben werden oder im Falle das ein Datensatz besteht, dieser "geändert" wird.
Von mir aus kann das "ändern" auch in einem separatem Form passieren.
Ich hoffe mir kann jemand eine "einfache" Hilfe dazu anbieten.
DANKE
Die XML-Datei
Die Datei zum speichern der Daten
Die XML-Datei
XML-Quellcode
-
- <?xml version="1.0"?>
- <ArrayOfWeatherData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <WeatherData>
- <Datum>2023-05-07T00:00:00</Datum>
- <WetterTag>sdfsdfsdfsdf</WetterTag>
- <WetterNacht>dsfsdfs</WetterNacht>
- <RegenTag>2</RegenTag>
- <SchneeTag>0</SchneeTag>
- <SchneeNacht>3</SchneeNacht>
- <LuftfminTag>56</LuftfminTag>
- <LuftfmaxTag>22</LuftfmaxTag>
- <LuftfminNacht>12</LuftfminNacht>
- <LuftfmaxNacht>44</LuftfmaxNacht>
- <TempTag>16</TempTag>
- <TempNacht>11</TempNacht>
- <WindTag>2</WindTag>
- <WindNacht>1</WindNacht>
- </WeatherData>
- <WeatherData>
- <Datum>2023-05-07T00:00:00</Datum>
- <WetterTag>R/T</WetterTag>
- <WetterNacht>K/LB</WetterNacht>
- <RegenTag>6</RegenTag>
- <SchneeTag>0</SchneeTag>
- <SchneeNacht>0</SchneeNacht>
- <LuftfminTag>77</LuftfminTag>
- <LuftfmaxTag>66</LuftfmaxTag>
- <LuftfminNacht>44</LuftfminNacht>
- <LuftfmaxNacht>55</LuftfmaxNacht>
- <TempTag>13</TempTag>
- <TempNacht>4</TempNacht>
- <WindTag>2</WindTag>
- <WindNacht>1</WindNacht>
- </WeatherData>
- </ArrayOfWeatherData>
Die Datei zum speichern der Daten
VB.NET-Quellcode
-
- Die Datei zum speichern der Daten
- Public Class frmInput
- Private _weatherData As List(Of WeatherData)
- Private ReadOnly _datafolder As String = Path.Combine(Application.StartupPath, "ApSet.xml")
- Dim _monthDirectory As String
- Dim _yearDirectory As String
- Dim NewDatafolder As String
- Public Sub New()
- InitializeComponent()
- ' Initialisiere die Liste der Wetterdaten
- _weatherData = New List(Of WeatherData)()
- End Sub
- Private Sub ReadDataFolderFromXml()
- Try
- Dim xDoc As XDocument = XDocument.Load(_datafolder)
- Dim dataFolderElement As XElement = xDoc.Root.Element("dataFolder")
- Dim dataLocation As XElement = xDoc.Root.Element("location")
- If dataFolderElement IsNot Nothing AndAlso dataLocation IsNot Nothing Then
- Dim savePath As String = dataFolderElement.Value.Trim()
- Dim location As String = dataLocation.Value.Trim()
- Me.Text = "Eingaben für den Ort: " & location
- lbl_savepath.Text = savePath
- NewDataFolder = savePath
- Else
- Throw New Exception("Die Elemente 'dataFolder' oder 'location' konnten nicht gefunden werden.")
- End If
- Catch ex As Exception
- MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
- Me.Close()
- End Try
- End Sub
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- ClearInputFields()
- ' Initialisiere die Liste der Wetterdaten und Speicherort auslesen
- _weatherData = New List(Of WeatherData)()
- ReadDatafolderFromXml()
- End Sub
- Private Function CheckControls(ByVal parent As Control) As Boolean
- For Each ctrl As Control In parent.Controls
- If TypeOf ctrl Is TextBox AndAlso String.IsNullOrEmpty(ctrl.Text) Then
- MessageBox.Show("Bitte füllen Sie alle Felder aus!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
- ctrl.Focus()
- Return False
- ElseIf ctrl.Controls.Count > 0 Then
- If Not CheckControls(ctrl) Then
- Return False
- End If
- End If
- Next
- Return True
- End Function
- Private Sub ConvertDecimalSeparator()
- For Each gb As Control In Me.Controls
- If gb.Enabled AndAlso TypeOf gb Is GroupBox Then
- For Each tb As TextBox In gb.Controls.OfType(Of TextBox)()
- If IsNumericWithDecimalPoint(tb.Text) Then
- tb.Text = tb.Text.Replace(",", ".").Replace(".", ",")
- End If
- Next
- End If
- Next
- End Sub
- Private Function IsNumericWithDecimalPoint(ByVal text As String) As Boolean
- Dim decimalSeparator As String = Globalization.CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator
- Dim pattern As String = "^[+-]?\d*\" & decimalSeparator & "?\d+$|^[+-]?\d+" & decimalSeparator & "\d+$"
- Return System.Text.RegularExpressions.Regex.IsMatch(text, pattern)
- End Function
- Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click
- If CheckControls(Me) Then
- Try
- ConvertDecimalSeparator()
- ' Lese die Daten aus dem Formular
- Dim datum As DateTime = dtpDatum.Value
- Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture("de-DE")
- Dim dateString As String = datum.ToString("dd.MM.yyyy", culture)
- Dim WetterTag As String = txtWetterTag.Text
- Dim WetterNacht As String = txtWetterNacht.Text
- Dim RegenTag As Double = Double.Parse(txtRegenTag.Text)
- 'Dim RegenNacht As Double = Double.Parse(txtRegenNacht.Text)
- Dim SchneeTag As Double = Double.Parse(txtSchneeTag.Text)
- Dim SchneeNacht As Double = Double.Parse(txtSchneeNacht.Text)
- Dim LuftfMinTag As Double = Double.Parse(txtLuftfMinTag.Text)
- Dim LuftfMaxTag As Double = Double.Parse(txtLuftfMaxTag.Text)
- Dim LuftfMinNacht As Double = Double.Parse(txtLuftfMinNacht.Text)
- Dim LuftfMaxNacht As Double = Double.Parse(txtLuftfMaxNacht.Text)
- Dim TempTag As Double = Double.Parse(txtTempTag.Text)
- Dim TempNacht As Double = Double.Parse(txtTempNacht.Text)
- Dim WindTag As Double = Double.Parse(txtWindTag.Text)
- Dim WindNacht As Double = Double.Parse(txtWindNacht.Text)
- 'Dim luftdruck As Double = Double.Parse(txtLuftdruck.Text)
- 'Dim windrichtung As String = txtWindrichtung.Text
- ' Erstelle ein neues WeatherData-Objekt
- Dim data As New WeatherData()
- data.Datum = CDate(dateString) 'datum
- data.WetterTag = WetterTag
- data.WetterNacht = WetterNacht
- data.RegenTag = RegenTag
- 'data.RegenNacht = RegenNacht
- data.SchneeTag = SchneeTag
- data.SchneeNacht = SchneeNacht
- data.LuftfminTag = LuftfMinTag
- data.LuftfmaxTag = LuftfMaxTag
- data.LuftfminNacht = LuftfMinNacht
- data.LuftfmaxNacht = LuftfMaxNacht
- data.TempTag = TempTag
- data.TempNacht = TempNacht
- data.WindTag = WindTag
- data.WindNacht = WindNacht
- 'data.Luftdruck = luftdruck
- 'data.Windrichtung = windrichtung
- Dim existingData As List(Of WeatherData) = Nothing
- Dim existingFileName = Path.Combine(NewDatafolder, datum.ToString("yyyy-MM") & ".xml")
- If File.Exists(existingFileName) Then
- Dim existingSerializer = New XmlSerializer(GetType(List(Of WeatherData)))
- Using existingFileStream = New FileStream(existingFileName, FileMode.Open)
- existingData = TryCast(existingSerializer.Deserialize(existingFileStream), List(Of WeatherData))
- End Using
- End If
- If existingData IsNot Nothing Then
- existingData.Add(data)
- Dim serializer = New XmlSerializer(GetType(List(Of WeatherData)))
- Using fileStream = New FileStream(existingFileName, FileMode.Create)
- serializer.Serialize(fileStream, existingData)
- End Using
- Else
- _weatherData.Add(data)
- Dim fileName = Path.Combine(NewDatafolder, data.Datum.ToString("yyyy-MM") & ".xml")
- Dim serializer = New XmlSerializer(GetType(List(Of WeatherData)))
- Using fileStream = New FileStream(fileName, FileMode.Create)
- serializer.Serialize(fileStream, _weatherData)
- End Using
- End If
- MessageBox.Show("Daten wurden erfolgreich gespeichert!")
- Catch ex As Exception
- MessageBox.Show("Fehler beim Speichern der Daten: " & ex.Message)
- End Try
- End If
- End Sub
- Private Sub chk_Regen_CheckedChanged(sender As Object, e As EventArgs) Handles chk_Regen.CheckedChanged
- AktualisiereRegenLabel()
- End Sub
- Private Sub AktualisiereRegenLabel()
- If chk_Regen.Checked Then
- txtRegenNacht.Text = "0"
- txtRegenNacht.Enabled = False
- Else
- txtRegenNacht.Text = " "
- txtRegenNacht.Enabled = True
- End If
- End Sub
- Private Sub ClearInputFields()
- ' Leere alle aktivierten Textboxen in GroupBox-Steuerelementen
- For Each gb As GroupBox In Me.Controls.OfType(Of GroupBox)()
- For Each ctrl As Control In gb.Controls
- If TypeOf ctrl Is TextBox AndAlso ctrl.Enabled Then
- DirectCast(ctrl, TextBox).Clear()
- End If
- Next
- Next
- ' Setze das Datum des DateTimePicker-Steuerelements auf das aktuelle Datum
- For Each dtp As DateTimePicker In Me.Controls.OfType(Of DateTimePicker)()
- If dtp.Enabled Then
- dtp.Value = DateTime.Now
- End If
- Next
- 'MessageBox.Show("Daten wurden erfolgreich geleert")
- End Sub
- Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
- ClearInputFields()
- End Sub
- Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
- Me.Close()
- End Sub
- End Class
- Public Class WeatherData
- Public Property Datum As DateTime
- Public Property WetterTag As String
- Public Property WetterNacht As String
- Public Property RegenTag As Double
- 'Public Property RegenNacht As Double
- Public Property SchneeTag As Double
- Public Property SchneeNacht As Double
- Public Property LuftfminTag As Double
- Public Property LuftfmaxTag As Double
- Public Property LuftfminNacht As Double
- Public Property LuftfmaxNacht As Double
- Public Property TempTag As Double
- Public Property TempNacht As Double
- Public Property WindTag As Double
- Public Property WindNacht As Double
- 'Public Property Luftdruck As Double
- 'Public Property Windrichtung As String
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.