Autor |
Beitrag |
Ivy
      
Beiträge: 228
|
Verfasst: Do 26.01.12 11:27
hallo zusammen,
ich möchte gerne meine Datagridview tabelle in einer XML Datei speichern. Habe auch jetzt schon einiges im internet darüber gefunden, aber nichts was wirklich funktioniert. Ich möchte ausserdem, dass ich zusätzlich das Datenformat mit abspeichern kann....
in etwa diesem format soll die xml datei sein:
XML-Daten 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| <?xml version="1.0" encoding="utf-8"?> <ArrayOfData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Data> <Key xsi:type="xsd:string">AdapterType</Key> <Value xsi:type="xsd:string">StepAdapter</Value> </Data> <Data> <Key xsi:type="xsd:string">CheckCodeMain</Key> <Value xsi:type="xsd:string">350</Value> </Data> |
Das Datagridview wird noch zur laufzeit editierbar sein.
vielleicht kann mir jemand helfen..
DANKE
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 26.01.12 12:53
Hallo Ivy,
das beste wird sein, du verwendest DataBinding dafür, d.h. du erstellst eine DataTable (bzw. ein DataSet mit entsprechenden DataTables drin) und bindest dieses dann an das DGV (per DataSource).
Nun kannst du einfach die DataTable mittels DataTable.WriteXml serialisieren (und per ReadXml deserialisieren).
Oder soll das XML exakt so wie in deinem Beispiel sein (Woher hast du dieses denn?)?
Dann sieht das nach einem Data-Array aus, wobei Data die Eigenschaften Key und Value besitzt:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| class Data { public string Key { get; set; } public string Value { get; set; } }
Data[] data = new Data[size];
|
Und dieses Array (bzw. List) bindest du dann an das DGV...
Und zum (De-)Serialiseren dann diesen Artikel verwenden: Mit XmlSerializer Objekte als XML… speichern und laden
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: Do 26.01.12 14:27
|
|
daeve
      
Beiträge: 116
Erhaltene Danke: 3
Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
|
Verfasst: Do 26.01.12 20:48
wo ist den mit deinem DataSet und die BindingSource ?
Wie oben schon erwähnt wurde, erstelle ein DataSet und binde das mit einer BindingSource an dein DGV.
Am besten du googelst mal danach und frags wieder wenn du mal einen Ansatz hast
Danach ist das erstellen eines XML nicht mehr schwer...
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 26.01.12 21:08
Hallo Ivy,
binden einfach mittels Zuweisung an die DataGridView.DataSource Eigenschaft (wie schon oben geschrieben
Und dein Beispiel bzgl. Dictionary ist eben genau der Ansatz, den ich auch mit der Liste beschrieben habe (weil man direkt kein Dictionary serialisieren kann).
Aber daeve hat schon recht bzgl. DataSet (oder DataTable): das ist flexibler bzgl. DataBinding. Wenn du aber mit dem XML-Format festgelegt bist, dann ist das Serialisieren per XmlSerializer aber einfacher.
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: Fr 27.01.12 09:29
okay habe es jetzt mal mit dem dataset probiert:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| private void btnSave_Click(object sender, EventArgs e) {
string myXMLfile = @"D:\\Customers.xml"; DataSet ds = new DataSet(); System.IO.FileStream fsReadXml = new System.IO.FileStream (myXMLfile, System.IO.FileMode.Open); try { ds.ReadXml(fsReadXml); DatenTabelle.DataSource = ds; DatenTabelle.DataMember = "Table1"; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { fsReadXml.Close(); }
}
private void btnLoad_Click(object sender, EventArgs e) { string myXMLfile = "D:\\Customers.xml"; DataSet ds = new DataSet(); try { ds.ReadXml(myXMLfile); DatenTabelle.DataSource = ds; DatenTabelle.DataMember = "Table1"; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } |
es kommt immer der fehler:
"Die untergeordnete Liste für das Feld Table1 kann nich erstellt werden"
DatenTabelle ist mein DGV!
|
|
daeve
      
Beiträge: 116
Erhaltene Danke: 3
Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
|
Verfasst: Fr 27.01.12 19:39
Hallo
du gibts deinem DGV als Datamember "Table1" an, gibt es das Feld in deinem XML ?
Das müsste es geben, aber dem Namen nach ist das kaum ein Feld.
müsste eher eine ID oder eine Bezeichnung sein aus deinem XML.
Setzt doch mal ein Breakpoint und debugge das ganze, dann siehst du wo der Fehler entspringt.
aber wahrscheindlich ist das dein Problem
C#-Quelltext 1:
| DatenTabelle.DataMember = "Table1"; |
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: Mo 30.01.12 09:00
ja also ich habe eine Spalte Namens "Table1"... dder fehler kommt aber trotzdem. und ja beim debuggen geschieht er genau in dieser zeile
C#-Quelltext 1:
| DatenTabelle.DataMember = "Table1"; |
|
|
daeve
      
Beiträge: 116
Erhaltene Danke: 3
Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
|
Verfasst: Mo 30.01.12 12:08
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: Mo 30.01.12 15:24
ok... dann läuft es durch, aber es wird trotzdem nichts in meiner xml gespeichert. es wird nur mein datagrid geleert....
beim debuggen find ich meine daten aber auch nicht
|
|
daeve
      
Beiträge: 116
Erhaltene Danke: 3
Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
|
Verfasst: Mo 30.01.12 16:58
gespeichert ? aber zeigt es jetzt Daten an ?
hast du den den DS wider in ein XML geschrieben ?
ein wenig mehr infos... und code wäre hilfreich...
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: Mo 30.01.12 17:02
nein es werden keine daten angezeigt.
code habe ich ja oben komplett gepostet....hab ja nur das member jetzt entfernt
|
|
daeve
      
Beiträge: 116
Erhaltene Danke: 3
Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
|
Verfasst: Mo 30.01.12 20:47
Ivy hat folgendes geschrieben : | nein es werden keine daten angezeigt.
code habe ich ja oben komplett gepostet....hab ja nur das member jetzt entfernt |
ja indemfall ist die XML falsch der der Pfad stimmt nicht.
msdn.microsoft.com/e...762271(v=vs.85).aspx
hier hast du eine korrekte XML.
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 30.01.12 20:57
Hallo Ivy,
hast du denn die XML-Datei "Customer.xml" auch mit dem DataSet rausgeschrieben? Denn diese muß in einem bestimmten Format sein, damit sie von ds.ReadXml korrekt eingelesen wird (die von daeve verlinkte XML-Datei ist auf jeden Fall nicht kompatibel mit dem DataSet-Format).
So langsam könnte dieses Thema aber mal beendet werden...
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: Di 31.01.12 09:06
wie mit dem datatset rausgeschrieben??? die datei existiert und ist leer bei mir. welches format muss sie haben?
das laden klappt jetzt damit:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| XmlDocument i = new XmlDocument(); DataSet ds = new DataSet(); XmlReader xmlFile; xmlFile = XmlReader.Create("D:\\Customers.xml", new XmlReaderSettings()); ds.ReadXml(xmlFile); DatenTabelle.DataSource = ds.Tables[0]; xmlFile.Close(); |
XML-Daten 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| <?xml version="1.0" encoding="utf-8"?>
<Data> <DataSet> <Key>ABC</Key> <Value> 15741</Value> </DataSet> <DataSet> <Key>bjkfh</Key> <Value>52435</Value> </DataSet> <DataSet> <Key>fdchfh</Key> <Value>147527</Value> </DataSet> </Data> |
jetzt noch dsas problem mit dem speichern....
damit legt er mir zwar die spalten an die ich im grid hab aber daten werden keine gespeichert:
C#-Quelltext 1: 2: 3:
| dt = (DataTable)DatenTabelle.DataSource; ds.Tables.Add(dt); ds.WriteXml("D:\\Customers.xml", System.Data.XmlWriteMode.IgnoreSchema); |
wieso? 
|
|
Ivy 
      
Beiträge: 228
|
Verfasst: Mi 01.02.12 09:15
problem besteht immernoch :-/
daten können geladen werden, speichern funktioniert leider nicht. es werden nur die elemente aber ohne inhalt angelegt....
also so sieht meine xml bis jetzt aus:
XML-Daten 1: 2: 3: 4: 5:
| <?xml version="1.0" standalone="yes"?> <DocumentElement> <TableName /> <TableName /> </DocumentElement> |
|
|