Entwickler-Ecke
WinForms - DataGridView in XML speichern
Ivy - Do 26.01.12 11:27
Titel: DataGridView in XML speichern
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 - 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 [
http://www.c-sharp-library.de/topic_64947.html]
Ivy - Do 26.01.12 14:27
okay danke, also praktisch so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| private string key = string.Empty; public string Key { get { return key; } set { key = value; } }
private string keydata = string.Empty; public string KeyData { get { return keydata; } set { keydata = value; } } public void WriteXml(string fileName) { XmlSerializer serializer = new XmlSerializer(this.GetType()); TextWriter writer = new StreamWriter(fileName); serializer.Serialize(writer, this); writer.Close(); } |
Quelltext
1:
| Und dieses Array (bzw. List) bindest du dann an das DGV... |
wie binde ich das an???
habe auch noch was gefunden wo man es mit einem "dictionary" machen könnt. verstehe es aber nicht so wirklich...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| public static void WriteXmlDic(string filename, IDictionary dictionary) { TextWriter writer = new StreamWriter(filename); List<Data> entries = new List<Data>(dictionary.Count); foreach (object key in dictionary.Keys) { entries.Add(new Data(key, dictionary[key])); }
XmlSerializer serializer = new XmlSerializer(typeof(List<Data>)); serializer.Serialize(writer, entries); writer.Close(); } |
daeve - 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 :wink:
Danach ist das erstellen eines XML nicht mehr schwer...
Th69 - 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 - Fr 27.01.12 09:29
okay habe es jetzt mal mit dem dataset probiert:
C#-Quelltext
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 - 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 - 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 - Mo 30.01.12 12:08
Ivy hat folgendes geschrieben : |
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"; | |
dann versuch`s mal ohne DataMenber, so sollte einfach dein ganzes DataSet angezeigt werden.
Oder schau mal im Debuggen wie dein DS gefüllt ist...
Ivy - 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 - 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 - 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
Th69 - 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 - 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 - 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> |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!