Hallo ihr lieben, ich hoffe jemand kann mir helfen. Es geht um folgendes.
Zum HIntergrund, ich habe ein kleines Programm in VB.net geschrieben, mit dem zum größten Teil eingetragene Werte von NumUpDown oder Checkboxen in Dictionarys gespeichert werden.
Diese werden dann bei Bedarf über eine XML Dataset in eine XML Datei geschrieben und können dann wieder auf gleichem Weg von XML > Dataset in die Dictionarys > Controls geladen werden.
Die Datatables habe ich über die Toolbox hinzugefügt, sie Taucht also im Projekt Explorer nicht auf, wohl aber unter dem Hauptframe und per Eigenschaften, habe ich die nötigen Einträge schon hinzugefügt. (Es passiert also nicht mehr bei der Laufzeit). Jede Table ist für ein Dictionary zuständig ,und die Einträge sind Entweder Decimal oder Boolean und haben den Wert "Attribute". Die Dictionarys werden auch beim Programmstart ("Keys" erstellt). Lediglich die Values (Einstellungen der Controls) werden dort dann per Code eingetragen.
So speichere ich die Dic in die Tables:
Es sind noch weitere Tables, aber ich denke es zeigt, wie ich sie speichere. in der XML Datei sieht man sie dann so.
Das Laden der XML mache ich so. (Und prüfe ob der Eintrag "Ja" an nötiger Stelle ist, um zumindest davon ausgehen zu können, das man versucht die richtige XML zu laden.)
Die Subs "Dicimport" und "Dicimport2" sollten für die Decimal bzw Boolean sein. Eigtl. sollte auch mit diesen Subs geschaut werden, ob er Key den ich aus der XML Importiere noch in den Dic`s existiert, bevor ich die reinschreibe, das klappt zumindest, oder es kommt kein Fehler..
Nun zum Problem:
Ich schätze die beiden Import Subs, haben kaum den richtige Code, um 2 bestimmte Szenarios abzudecken
1.) Der Eintrag in der XML Datei gibt es nicht mehr im Tool (Dicionarys / Dataset)
2.) Es fehlt ein EIntrag in der XML Datei, weil sie älter ist und es diesen noch nicht gab.
Ich hoffe, da ich meinen zugegeben miesen Code .. offen lege, das mir jemand da helfen mag wie ich das abfange. Also Eintrag in der XML zu wenig oder zu viel, Nachricht ausgeben und übergehen. Wenn alles ok ist, den Wert in das passende Dic schreiben.
EDIT
Habe den Code hinzugefügt,
In dem Case stehen wirklich nur noch weitere Dics die so aufgebaut sind, wie "Spezielles" wollte den Beitrag nicht so voll werden lassen, sah so schon zu viel aus..
Case 3 Mannschaft dass man sieht wie der Code aussieht (Er ruft die Import auf für Decimal)
End Select
Next
End Sub
Zum HIntergrund, ich habe ein kleines Programm in VB.net geschrieben, mit dem zum größten Teil eingetragene Werte von NumUpDown oder Checkboxen in Dictionarys gespeichert werden.
Diese werden dann bei Bedarf über eine XML Dataset in eine XML Datei geschrieben und können dann wieder auf gleichem Weg von XML > Dataset in die Dictionarys > Controls geladen werden.
Die Datatables habe ich über die Toolbox hinzugefügt, sie Taucht also im Projekt Explorer nicht auf, wohl aber unter dem Hauptframe und per Eigenschaften, habe ich die nötigen Einträge schon hinzugefügt. (Es passiert also nicht mehr bei der Laufzeit). Jede Table ist für ein Dictionary zuständig ,und die Einträge sind Entweder Decimal oder Boolean und haben den Wert "Attribute". Die Dictionarys werden auch beim Programmstart ("Keys" erstellt). Lediglich die Values (Einstellungen der Controls) werden dort dann per Code eingetragen.
So speichere ich die Dic in die Tables:
VB.NET-Quellcode
- Sub Speichern()
- Dim SFD As New SaveFileDialog With {
- .Filter = "*.xml|*.xml"
- }
- If SFD.ShowDialog = Windows.Forms.DialogResult.Cancel Then
- Exit Sub
- End If
- EntariaShip.XMLDataset.Clear()
- EntariaShip.XMLDataset.Tables("Datei").Rows.Add(New Object() {"Ja", My.Settings.Version})
- EntariaShip.XMLDataset.Tables("Antriebe").Rows.Add(New Object() _
- {My.Settings.AntriebsBEW, 'Bewegungspunkte
- My.Settings.AntriebsPreisMulti, 'Preismultiplikator
- My.Settings.AntriebsSteigerMulti, 'Steigerungs Preismultiplikator
- My.Settings.AntriebsSteigerung, 'gekaufte Steigerung
- My.Settings.AntriebsTyp, 'Antriebstyp
- My.Settings.AntriebsWarpSteigerung, 'gekaufte Warpsteigerung
- My.Settings.Warp}) 'effektive Warpstufe
- EntariaShip.XMLDataset.Tables("Spezielles").Rows.Add(New Object() _
- {EntariaShip.DicSpezielles("Gastank"),
- EntariaShip.DicSpezielles("Raumfaltsprunktank"),
- EntariaShip.DicSpezielles("Sprungdüsen"),
- EntariaShip.DicSpeziellesBool("Booster"),
- EntariaShip.DicSpeziellesBool("Cyberlink"),
- EntariaShip.DicSpeziellesBool("Fusionsgenerator"),
- EntariaShip.DicSpeziellesBool("GelKonverter"),
- EntariaShip.DicSpeziellesBool("Luftschiff"),
- EntariaShip.DicSpeziellesBool("MAMReaktor"),
- EntariaShip.DicSpeziellesBool("Mecharme"),
- EntariaShip.DicSpeziellesBool("Motorradbeiwagen"),
- EntariaShip.DicSpeziellesBool("Raumfaltantrieb"),
- EntariaShip.DicSpeziellesBool("Schwerkraft-Generator"),
- EntariaShip.DicSpeziellesBool("Vektorschubkontrolle")})
- EntariaShip.XMLDataset.WriteXml(SFD.FileName, XmlWriteMode.IgnoreSchema)
- End Sub
Es sind noch weitere Tables, aber ich denke es zeigt, wie ich sie speichere. in der XML Datei sieht man sie dann so.
XML-Quellcode
- <?xml version="1.0" standalone="yes"?>
- <EntariaShipDatenbank>
- <Datei EntariaSchiff="Ja" Version="0.0.8" />
- <Antriebe AntriebsBEW="16" AntriebsPreisMulti="10000" AntriebsSteigerMulti="1000" AntriebsSteigerung="0" AntriebsTyp="Antigrav-System" AntriebsWarpSteigerung="2" Warp="3" />
- <Spezielles Gastank="1" Raumfaltsprunktank="1" Sprungdüsen="0" Booster="false" Cyberlink="false" Fusionsgenerator="true" GelKonverter="false" Luftschiff="false" MAMReaktor="true" Mecharme="false" Motorradbeiwagen="false" Raumfaltantrieb="true" Schwerkraft-Generator="true" Vektorschubkontrolle="false" />
- </EntariaShipDatenbank>
Das Laden der XML mache ich so. (Und prüfe ob der Eintrag "Ja" an nötiger Stelle ist, um zumindest davon ausgehen zu können, das man versucht die richtige XML zu laden.)
VB.NET-Quellcode
- Sub Laden()
- Dim OFD As New OpenFileDialog With {
- .Filter = "*.xml|*.xml"
- }
- EntariaShip.XMLDataset.Clear()
- If OFD.ShowDialog = Windows.Forms.DialogResult.Cancel Then
- Exit Sub
- Else
- EntariaShip.XMLDataset.ReadXml(OFD.FileName)
- If Not EntariaShip.XMLDataset.Tables("Datei").Rows(0)("EntariaSchiff").ToString = "Ja" Then
- MessageBox.Show("Falsche Datei")
- Exit Sub
- Else
- MessageBox.Show("Gut")
- End If
- End If
- For Reinladen = 1 To 10
- Select Case Reinladen
- Case Is = 1 'Antriebe
- Dim DS = EntariaShip.XMLDataset.Tables("Antriebe")
- With My.Settings
- .AntriebsBEW = CInt(DS.Rows(0)("AntriebsBEW"))
- .AntriebsPreisMulti = CInt(DS.Rows(0)("AntriebsPreisMulti"))
- .AntriebsSteigerMulti = CInt(DS.Rows(0)("AntriebsSteigerMulti"))
- .AntriebsSteigerung = CInt(DS.Rows(0)("AntriebsSteigerung"))
- .AntriebsTyp = DS.Rows(0)("AntriebsTyp").ToString
- .AntriebsWarpSteigerung = CInt(DS.Rows(0)("AntriebsWarpSteigerung"))
- .Warp = CInt(DS.Rows(0)("Warp"))
- End With
- Case Is = 2 'Spezielles
- Dim DS = EntariaShip.XMLDataset.Tables("Spezielles")
- Dim Dic As Dictionary(Of String, Decimal) = EntariaShip.DicSpezielles
- Dim DicBool As Dictionary(Of String, Boolean) = EntariaShip.DicSpeziellesBool
- Dicimport2(DS, Dic, DicBool)
- Case Is = 3 'Mannschaft
- Dim DS = EntariaShip.XMLDataset.Tables("Mannschaft")
- Dim Dic As Dictionary(Of String, Decimal) = EntariaShip.DicMannschaft
- Dicimport(DS, Dic)
- End Select
- Next
- End Sub
- Sub Dicimport(ByVal DS As DataTable, ByRef Dic As Dictionary(Of String, Decimal))
- For Each dr As DataColumn In DS.Columns
- If Dic.ContainsKey(dr.ColumnName) Then
- Dic(dr.ColumnName) = CDec(DS.Rows(0)(dr))
- Else
- MessageBox.Show("Der Eintrag: " & dr.ColumnName & " existiert in dieser Version leider nicht mehr!")
- End If
- Next
- End Sub
- Sub Dicimport2(ByVal DS As DataTable, ByRef Dic As Dictionary(Of String, Decimal), ByRef DicBool As Dictionary(Of String, Boolean))
- For Each dr As DataColumn In DS.Columns
- If DS.Rows(0)(dr).GetType() = GetType(Decimal) Then
- If Dic.ContainsKey(dr.ColumnName) Then
- Dic(dr.ColumnName) = CDec(DS.Rows(0)(dr))
- Else
- MessageBox.Show("Der Eintrag: " & dr.ColumnName & " existiert in dieser Version leider nicht mehr!")
- End If
- Else
- If DicBool.ContainsKey(dr.ColumnName) Then
- DicBool(dr.ColumnName) = CBool(DS.Rows(0)(dr))
- Else
- MessageBox.Show("Der Eintrag: " & dr.ColumnName & " existiert in dieser Version leider nicht mehr!")
- End If
- End If
- Next
- End Sub
Die Subs "Dicimport" und "Dicimport2" sollten für die Decimal bzw Boolean sein. Eigtl. sollte auch mit diesen Subs geschaut werden, ob er Key den ich aus der XML Importiere noch in den Dic`s existiert, bevor ich die reinschreibe, das klappt zumindest, oder es kommt kein Fehler..
Nun zum Problem:
Ich schätze die beiden Import Subs, haben kaum den richtige Code, um 2 bestimmte Szenarios abzudecken
1.) Der Eintrag in der XML Datei gibt es nicht mehr im Tool (Dicionarys / Dataset)
2.) Es fehlt ein EIntrag in der XML Datei, weil sie älter ist und es diesen noch nicht gab.
Ich hoffe, da ich meinen zugegeben miesen Code .. offen lege, das mir jemand da helfen mag wie ich das abfange. Also Eintrag in der XML zu wenig oder zu viel, Nachricht ausgeben und übergehen. Wenn alles ok ist, den Wert in das passende Dic schreiben.
EDIT
Habe den Code hinzugefügt,
In dem Case stehen wirklich nur noch weitere Dics die so aufgebaut sind, wie "Spezielles" wollte den Beitrag nicht so voll werden lassen, sah so schon zu viel aus..
Case 3 Mannschaft dass man sieht wie der Code aussieht (Er ruft die Import auf für Decimal)
End Select
Next
End Sub
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Black-Mage“ ()