EDIT um 15:00 UHR
Bis auf den Code in der Region "Berechnungen" habe ich mal aufgeräumt und den Code hoffentlich verbessert.
Moin moin
Ich schreibe weiter an meiner WetterApp. Gleich zur Info, die wird nur auf einem älteren Laptop laufen, deswegen können die Pfade so "hardcodiert" sein. Also rein privat.
Ich erzeuge ja nun für jeden Monat eine XML-Datei. Nun sollen diese durchlaufen werden, und aus den einzelnen Knoten die Durchschnittswerte berechnet werden.
Diese sollen dann in einem DGV angezeigt und auch wieder als XML-Datei gespeichert werden.
Ich weiß nicht genau wie ich an die Auswertung herangehen soll. Eine Idee war es, erst für jeden Monat die ganzen Durchschnittswerte zu berechen und dann die Jahresabrechnung.
Ich hoffe Ihr versteht was ich erreichen möchte und könnt mir bei der Umsetzung helfen.
Einiges was ich bisher habe, funktioniert soweit.
Probleme gibt es bei den Berechnungen und anzeigen im DGV. Ich hänge mal Bilder an um es ggf zu verdeutlichen.
Mein bisheriger Code. Den Teil um das DGV zu formatieren habe ich weggelassen!
Spoiler anzeigen
Bis auf den Code in der Region "Berechnungen" habe ich mal aufgeräumt und den Code hoffentlich verbessert.
Moin moin
Ich schreibe weiter an meiner WetterApp. Gleich zur Info, die wird nur auf einem älteren Laptop laufen, deswegen können die Pfade so "hardcodiert" sein. Also rein privat.
Ich erzeuge ja nun für jeden Monat eine XML-Datei. Nun sollen diese durchlaufen werden, und aus den einzelnen Knoten die Durchschnittswerte berechnet werden.
Diese sollen dann in einem DGV angezeigt und auch wieder als XML-Datei gespeichert werden.
Ich weiß nicht genau wie ich an die Auswertung herangehen soll. Eine Idee war es, erst für jeden Monat die ganzen Durchschnittswerte zu berechen und dann die Jahresabrechnung.
Ich hoffe Ihr versteht was ich erreichen möchte und könnt mir bei der Umsetzung helfen.
Einiges was ich bisher habe, funktioniert soweit.
Probleme gibt es bei den Berechnungen und anzeigen im DGV. Ich hänge mal Bilder an um es ggf zu verdeutlichen.
Mein bisheriger Code. Den Teil um das DGV zu formatieren habe ich weggelassen!
VB.NET-Quellcode
- Public Class frmMain
- #Region "Form-laden"
- 'Klasse zum laden der MonatsXML etc.
- Private FileManager As New FileManager
- 'Klasse zum speichern der AbschlussXML
- Private SaveXMLfile As New SaveXMLfile
- 'Klasse für die Wetterdaten
- Private weatherDataList As New WeatherDataArray
- 'Zeilenhöhe des DGV festlegen
- Private Const dgvCellhight As Integer = 32
- Public Sub New()
- InitializeComponent()
- LoadMonthXmlFiles()
- 'FormatDataGridView(DGV_1, dgvCellhight)
- End Sub
- Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- Dim yearXmlFile As String = String.Format("Abschluss-{0}.xml", Date.Now.Year)
- Dim yearXmlPath As String = Path.Combine(FileManager.OutputPath, yearXmlFile)
- lbl_Yearfile.Text = yearXmlPath
- CalcAllValues()
- End Sub
- #End Region
- #Region "Buttons"
- Private Sub btn_SaveXML_Click(sender As Object, e As EventArgs) Handles btn_SaveXML.Click
- ' DataGridView-Daten in eine DataTable konvertieren
- Dim dt As DataTable = SaveXMLfile.ConvertDataGridViewToDataTable(DGV_1)
- ' DataTable in eine XML-Datei speichern
- SaveXMLfile.SaveDataTableToXmlFile(dt, FileManager.outputPath)
- End Sub
- #End Region
- #Region "Monats XMLs laden"
- Private Sub LoadMonthXmlFiles()
- ' Ruft die GetXmlFiles()-Methode in der XmlFileManager-Klasse auf, um die XML-Dateien zu erhalten
- Dim xmlFiles As List(Of String) = FileManager.GetXmlFiles()
- ' Füllt die Listbox mit den XML-Dateien
- If xmlFiles.Count > 0 Then
- listbox_XML_Files.DataSource = xmlFiles
- Else
- MessageBox.Show("Keine XML-Dateien gefunden.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
- End If
- End Sub
- #End Region
- #Region "Berechnungen"
- Private Sub CalcAllValues()
- Dim rainValues As New List(Of Double)
- For Each xmlFile In listbox_XML_Files.Items()
- Dim xmlDoc As New XmlDocument()
- xmlDoc.Load(CStr(xmlFile))
- Dim weatherDataNodes As XmlNodeList = xmlDoc.SelectNodes("//WeatherData")
- For Each weatherDataNode As XmlNode In weatherDataNodes
- Dim regenNode As XmlNode = weatherDataNode.SelectSingleNode("RegenTag")
- Dim regenValue As Double = Double.Parse(regenNode.InnerText)
- rainValues.Add(regenValue)
- Next
- Next
- 'Listbox nur zum Test
- listbox_regen.DataSource = rainValues
- listbox_regen.Refresh()
- ' Durchschnitt für jeden Monat berechnen
- For month As Integer = 1 To 12
- Dim currentMonth As Integer = month
- Dim monthRainValues = rainValues.Where(Function(r)
- Dim monthDate = New DateTime(dtpDatum.Value.Year, currentMonth, 1)
- Return monthDate.Month = currentMonth
- End Function)
- Dim averageRain = If(monthRainValues.Any(), monthRainValues.Average(), 0)
- 'Label nur zum Test
- label_averageRegen.Text = "Durchschnittlicher Regen: " & averageRain.ToString("F2") & " mm"
- Dim monthData As New WeatherData With {
- .Datum = New DateTime(dtpDatum.Value.Year, currentMonth, 1).ToString,
- .Regen24h = CDbl(averageRain.ToString("F2"))
- }
- weatherDataList.Add(monthData)
- Next
- ' DGV aktualisieren
- DGV_1.DataSource() = weatherDataList
- DGV_1.Refresh()
- End Sub
- #End Region
- End Class
- 'Klasse für Wetterdaten
- Public Class WeatherData
- Private _datum As Date
- Public Property Datum As String
- Get
- Return _datum.ToString("MM - yyyy")
- End Get
- Set(ByVal value As String)
- If Date.TryParse(value, _datum) Then
- _datum = _datum.Date
- Else
- Throw New ArgumentException("Ungültiges Datumsformat.")
- End If
- End Set
- End Property
- Public Property Regen24h 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
- End Class
- 'Klasse für Array von Wetterdaten
- Public Class WeatherDataArray
- Inherits List(Of WeatherData)
- End Class
- Public Class FileManager
- 'Pfade können so bleiben, da die App nur auf einem Laptop laufen wird.
- Private _folderPath As String = "C:\Wetterdaten"
- Public Property FolderPath As String
- Get
- Return _folderPath
- End Get
- Set(value As String)
- _folderPath = value
- End Set
- End Property
- Private _outputPath As String = "C:\Wetterdaten\Jahresdaten"
- Public Property OutputPath As String
- Get
- Return _outputPath
- End Get
- Set(value As String)
- _outputPath = value
- End Set
- End Property
- Public Sub New()
- CreateOutputDirectory()
- End Sub
- Public Function GetXmlFiles() As List(Of String)
- Return Directory.GetFiles(folderPath, "??-????.xml").Where(Function(file) Regex.IsMatch(Path.GetFileNameWithoutExtension(file), "^\d{2}-\d{4}$")).ToList()
- End Function
- Public Sub CreateOutputDirectory()
- If Not Directory.Exists(outputPath) Then
- Directory.CreateDirectory(outputPath)
- End If
- End Sub
- End Class
- Public Class SaveXMLfile
- 'Klasse zum speichern der AbschlussXML
- Public Function ConvertDataGridViewToDataTable(dgv As DataGridView) As DataTable
- Dim xmlDataTable As New DataTable("Abschluss")
- For Each column As DataGridViewColumn In dgv.Columns
- If column.Visible Then
- xmlDataTable.Columns.Add(column.HeaderText, column.ValueType)
- End If
- Next
- For Each row As DataGridViewRow In dgv.Rows
- If Not row.IsNewRow Then
- Dim dr As DataRow = xmlDataTable.NewRow()
- For Each column As DataGridViewColumn In dgv.Columns
- If column.Visible Then
- If column.Name = "Datum" AndAlso row.Cells(column.Index).Value IsNot Nothing Then
- Dim dateValue As Date = CType(row.Cells(column.Index).Value, Date)
- dr(column.HeaderText) = dateValue.ToString("MM/yyyy")
- Else
- dr(column.HeaderText) = If(row.Cells(column.Index).Value IsNot Nothing, row.Cells(column.Index).Value, DBNull.Value)
- End If
- End If
- Next
- xmlDataTable.Rows.Add(dr)
- End If
- Next
- Return xmlDataTable
- End Function
- Public Sub SaveDataTableToXmlFile(xmlDataTable As DataTable, outputPath As String)
- Dim yearXmlFile As String = String.Format("Abschluss-{0}.xml", Date.Now.Year)
- Dim yearXmlPath As String = Path.Combine(outputPath, yearXmlFile)
- xmlDataTable.TableName = "Abschluss"
- Try
- xmlDataTable.WriteXml(yearXmlPath)
- MessageBox.Show("XML-Datei erfolgreich gespeichert.", "Erfolgreich", MessageBoxButtons.OK, MessageBoxIcon.Information)
- Catch ex As Exception
- MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
- End Try
- End Sub
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amelie“ ()