Entwickler-Ecke
IO, XML und Registry - datagridview.datasource in XML schreiben
Bl!tz - Do 27.09.12 13:19
Titel: datagridview.datasource in XML schreiben
Hallo,
wie der Titel schon sagt möchte ich von einem datagridview-objekt bzw. dessen datasource eine XML erstellen. ich habe im moment folgenden Code:
Hiermit lese ich eine bereits bestehende XML-Datei aus und zeige sie im datagridview an.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| public void GetTable(string XMLPath) { DataTable table = new DataTable("XMLData");
table.Columns.Add("Profession", typeof(string)); table.Columns.Add("Rate", typeof(string));
XDocument data = XDocument.Load(XMLPath); IEnumerable<XElement> type = data.Descendants("workerType");
var profession = type .Select(x => new type() { Profession = x.Element("name").Value, Rate = x.Element("rate").Value });
dataGridView1.AutoSize = true; dataGridView1.Visible = true; dataGridView1.DataSource = profession.ToList(); } |
hier noch die type-Klasse:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| public class type { private object p;
public string Profession { get; set; } public string Rate { get; set; }
public type() { }
public type(object p) { // TODO: Complete member initialization this.p = p; } } |
jetzt möchte ich die aktuellen Daten (um Änderungen im DGV zu berücksichtigen) die sich im DGV befinden nehmen und in eine XML, vorzugsweise im gleichen Format wie die zuvor ausgelesene XML-Datei, schreiben.
meine ersten versuche sehen so aus
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void btnSetRate_Click(object sender, EventArgs e) { type type1 = new type(dataGridView1.DataSource);
XmlSerializer ser = new XmlSerializer(typeof(type)); FileStream str = new FileStream(@Application.StartupPath + "\\Test.xml", FileMode.Create); ser.Serialize(str, type1); //Hier werden mir in type1 alle Daten angezeigt wie ich sie haben möchte, aber ich weiß nicht wie ich diese str.Close(); //Daten jetzt in eine XML-Datei schreiben kann.
} |
und hier noch ein Ausschnitt aus der vorhandenen XML-Datei:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| <?xml version="1.0"?> <ArrayOfWorkerType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <workerType> <name>Type 1</name> <rate>30</rate> </workerType> <workerType> <name>Type 2</name> <rate>31</rate> </workerType> </ArrayOfWorkerType> |
wie bekomme ich jetzt diese Daten aus dem datagridview vernünftig in eine XML die ich auch nachher wieder auslesen kann?
mfg
Blitz
Ralf Jansen - Do 27.09.12 14:00
Vegiss das DataGridView an dieser Stelle und merk dir einfach die dem Grid zugewiesene Liste. Die Liste kannst du dann mit einem beliebigen Serialisierer wegschreiben.
Zitat: |
C#-Quelltext 1:
| type type1 = new type(dataGridView1.DataSource); | |
An DataSource hängt eine Liste von type Objecten nicht ein type Object. type ist übrigens ein selten dä...er Name. Verwechselbar mit den eingebauten Type Typ und absolut generisch und damit völlig nutzlos. Denk dir was besseres aus.
Wen du eine bereits ein XML (und hoffentlich XSD) hast kannst du dir auch eine passende Klasse über die im Framework enthaltene xsd.exe erzeugen lassen. Im schlimsten Fall aus dem xml eine xsd erzeugen und aus dem xsd eine Klasse. Oder willst du explizit das xml Format ändern?
Bl!tz - Do 27.09.12 14:51
nein ich will nicht gezwungenermaßen das XML-Format.
ich hab mir jetzt mit der xsd.exe eine xsd erstellen lassen die so aussieht, aber keine der Daten enthält die ich in der XML hatte(z.B. die aufschlüsselung der einzelnen types mit den zugehörigen rates):
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| <?xml version="1.0" encoding="utf-8"?> <xs:schema id="ArrayOfWorkerType" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="ArrayOfWorkerType" msdata:IsDataSet="true" msdata:Locale="en-US"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="workerType"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string" minOccurs="0" /> <xs:element name="rate" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> |
und die daraus erstellte Klasse:
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: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74:
| //------------------------------------------------------------------------------ // <auto-generated> // Dieser Code wurde von einem Tool generiert. // Laufzeitversion:4.0.30319.544 // // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn // der Code erneut generiert wird. // </auto-generated> //------------------------------------------------------------------------------
using System.Xml.Serialization;
// // Dieser Quellcode wurde automatisch generiert von xsd, Version=4.0.30319.1. //
/// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] public partial class ArrayOfWorkerType { private ArrayOfWorkerTypeWorkerType[] itemsField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute("workerType", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public ArrayOfWorkerTypeWorkerType[] Items { get { return this.itemsField; } set { this.itemsField = value; } } }
/// <remarks/> [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] public partial class ArrayOfWorkerTypeWorkerType { private string nameField; private string rateField; /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public string name { get { return this.nameField; } set { this.nameField = value; } } /// <remarks/> [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public string rate { get { return this.rateField; } set { this.rateField = value; } } } |
und wie bring ich das ganze jetzt zusammen?
Ralf Jansen - Do 27.09.12 14:54
Jetzt kannst du deine Daten per XmlSerializer in die ArrayOfWorkerType Klasse laden in der Klasse verändern und per XmlSerializer wieder speichern.
Bl!tz - Do 27.09.12 15:05
ich hab das Deserialisieren jetzt mal so versucht:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public void GetData(string XMLPath) { ArrayOfWorkerType test;
XmlSerializer xs = new XmlSerializer(typeof(ArrayOfWorkerType)); test = (ArrayOfWorkerType)xs.Deserialize(new StreamReader("GHworkerType.xsd")); dataGridView1.DataSource = test; } |
da kommt aber ne Exception:
Fehler im XML-Dokument (2,2).
Ralf Jansen - Do 27.09.12 15:14
type hat nichts mit ArrayOfWorkerType zu tun. Kannst also garantiert nicht das eine ins andere casten.
Vergiss vorläufig type und verwende ArrayOfWorkerType.
Also
C#-Quelltext
1:
| XmlSerializer xs = new XmlSerializer(typeof(ArrayOfWorkerType)); |
und nicht type.
Und binden solltest du dann test.Items und nicht einfach test. Wenn du dir die generierte Klasse ansiehst sollte auffallen das ArrayOfWorkerType selbst keine Liste ist sondern die einzelnen Elemente in der Items Property stecken.
Bl!tz - Do 27.09.12 15:19
ja das hab ich übersehen.
aber die Exception tritt ja trotzdem auf in dieser Zeile:
C#-Quelltext
1:
| test = (ArrayOfWorkerType)xs.Deserialize(new StreamReader("GHworkerType.xsd")); |
also ist wohl ein Fehler in der XSD. oder?
Ralf Jansen - Do 27.09.12 15:28
Wenn du ArrayOfWorkerType auch in den XmlSerializer geworfen hast und nicht wie in deinem Codeauszug type dann sollte das funktionieren.
Fehler im xml Dokument hört sich eher nach einem prinzipiell nicht validen XML an oder fehlerhaftem Dateiencoding (also z.B. die Datei ist nicht in utf-8 gespeichert sondern in irgendwas anderem). Unabhängig davon das die xsd.exe trotzdem dafür eine xsd und Klasse erstellen konnte.
Bl!tz - Do 27.09.12 15:43
also ist meine ursprüngliche XML schon fehlerhaft?
hier ist die komplette XML:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| <?xml version="1.0"?> <ArrayOfWorkerType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <workerType> <name>type1</name> <rate>75</rate> </workerType> <workerType> <name>type2</name> <rate>83</rate> </workerType> <workerType> <name>type3</name> <rate>105</rate> </workerType> <workerType> <name>type4</name> <rate>115</rate> </workerType> <workerType> <name>Others</name> <rate>0</rate> </workerType> </ArrayOfWorkerType> |
woran sehe ich jetzt das es nicht UTF-8 ist?
sorry für die blöden fragen aber ich muss das bis morgen zum laufen bringen :-)
Th69 - Do 27.09.12 15:58
Du mußt ja auch die XML-Datei deserialisieren und nicht die XSD-Datei:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public void GetData(string XMLPath) { ArrayOfWorkerType test;
XmlSerializer xs = new XmlSerializer(typeof(ArrayOfWorkerType)); test = (ArrayOfWorkerType)xs.Deserialize(new StreamReader(XMLPath)); dataGridView1.DataSource = test; } |
Besser aber den StreamReader noch per "using" einkappseln, also:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| public void GetData(string XMLPath) { XmlSerializer xs = new XmlSerializer(typeof(ArrayOfWorkerType)); using (var stream = new StreamReader(XMLPath)) { ArrayOfWorkerType test = (ArrayOfWorkerType)xs.Deserialize(stream); dataGridView1.DataSource = test; } } |
Ralf Jansen - Do 27.09.12 16:51
Zitat: |
Du mußt ja auch die XML-Datei deserialisieren und nicht die XSD-Datei: |
Good catch ;)
Bl!tz - Do 27.09.12 17:13
also so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| public void GetData(string XMLPath) {
XmlSerializer xs = new XmlSerializer(typeof(worker)); using (var stream = new StreamReader(XMLPath)) { worker test = (worker)xs.Deserialize(stream); dataGridView1.DataSource = test; } } |
aber die exception ist immer noch da.
hab die XML nochmal mit Notepad++ geöffnet und sie in UTF-8 abgespeichert und die klasse nochmal neu erstellt.
Ralf Jansen - Do 27.09.12 17:31
Wo kommt den jetzt worker her und was ist das?
Und die Exception um die es geht gibt ist weiterhin eine 'Fehler im XML-Dokument (an Stelle X)' Exception?
Bl!tz - Do 27.09.12 17:36
nachdem ich die xml in UTF-8 gespeichert habe und die xsd und die klasse neu erstellt habe, hieß die klasse nicht mehr ArrayOfWorkerType sondern worker.
ja ist immer noch der gleiche Fehler:
Fehler im XML-Dokument (2,2).
hier die "neue" Klasse nochmal:
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: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77:
| using System.Xml.Serialization; namespace MBG.SimpleWizard { }
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] public partial class worker { private workerType[] itemsField; [System.Xml.Serialization.XmlElementAttribute("type", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public workerType[] Items { get { return this.itemsField; } set { this.itemsField = value; } } }
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] public partial class workerType { private string nameField; private string rateField; [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public string name { get { return this.nameField; } set { this.nameField = value; } } [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] public string rate { get { return this.rateField; } set { this.rateField = value; } } } |
Ralf Jansen - Do 27.09.12 18:05
Kannst du einfach mal eine passende xml Datei zippen und anhängen?
Ich verliere den Faden bei deinem Problem. Und wenn ich das einfach mal selbst ausprobiere möchte ich mir nicht was aus irgendeinem bisher geposteten Codebroken zusammenbasteln der vielleicht schon gar nicht mehr aktuell ist.
Bl!tz - Fr 28.09.12 07:05
jetzt hab ich mal im Anhang die XML angehängt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!