Autor Beitrag
Ivy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden 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];

// oder alternativ List<Data> data = new List<Data>() und beim Serialisieren ToArray() dafür aufrufen.

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Do 26.01.12 14:27 
okay danke, also praktisch so:

ausblenden 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();
        }


ausblenden 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...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 116
Erhaltene Danke: 3

Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: Fr 27.01.12 09:29 
okay habe es jetzt mal mit dem dataset probiert:

ausblenden volle Höhe 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();
            // Create new FileStream with which to read the schema.
            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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 116
Erhaltene Danke: 3

Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
BeitragVerfasst: 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

ausblenden C#-Quelltext
1:
DatenTabelle.DataMember = "Table1";					
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
  DatenTabelle.DataMember = "Table1";					
daeve
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 116
Erhaltene Danke: 3

Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
BeitragVerfasst: Mo 30.01.12 12:08 
user profile iconIvy hat folgendes geschrieben Zum zitierten Posting springen:
ja also ich habe eine Spalte Namens "Table1"... dder fehler kommt aber trotzdem. und ja beim debuggen geschieht er genau in dieser zeile
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 116
Erhaltene Danke: 3

Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 116
Erhaltene Danke: 3

Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
BeitragVerfasst: Mo 30.01.12 20:47 
user profile iconIvy hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 user profile icondaeve verlinkte XML-Datei ist auf jeden Fall nicht kompatibel mit dem DataSet-Format).

So langsam könnte dieses Thema aber mal beendet werden...
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: 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:
ausblenden 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();


ausblenden 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:

ausblenden C#-Quelltext
1:
2:
3:
 dt = (DataTable)DatenTabelle.DataSource;
 ds.Tables.Add(dt);
 ds.WriteXml("D:\\Customers.xml", System.Data.XmlWriteMode.IgnoreSchema);


wieso? :(
Ivy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 228



BeitragVerfasst: 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:

ausblenden XML-Daten
1:
2:
3:
4:
5:
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
  <TableName />
  <TableName />
</DocumentElement>