Autor Beitrag
yndaso
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mi 24.03.10 10:39 
Hallo zusammen,
ich habe eine xml Datei, in der mehrere Tabellen "abgebildet sind".
Diese will ich in ein DataSet einlesen und anschließend eine bestimmte Tabelle in
einem DataGridView ausgeben.
Das Einlesen in das Dataset klappt soweit, ich schaffe es nur nicht, eine Tabelle aus dem
dataSet im Dgv zu visualisieren...

Hier mal mein Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
//XML einlesen
        string path = @"..\database.xml";
        dataSet1.ReadXml(path);
//Ausgabe     
  dataGridView1.DataSource = dataSet1;
  dataGridView1.DataMember = dataSet1.Tables[1].TableName;


Naja auf jeden Fall scheint hier noch was zu fehlen. Das DataGridView ist auf jeden Fall leer...
In dem DataSet sind aber alle Tabellen drin...

Vorab danke
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 24.03.10 11:57 
Hallo,

ohne die genaue Kenntnis von xml-Inhalt und xml-Struktur kann man nur schwer raten. Zwei gängige Probleme sind dies:

1. Das DataSet muss auch Informationen über die Struktur der Tabellen bekommen. Dazu gibt es zum einen die xsd-Schemadatei, die separat gespeichert sein kann und mit ReadXmlSchema einzulesen ist. Zum anderen kann sie in der xml-Datei enthalten sein; dann ist ggf. eine Überladung von ReadXml zu verwenden (je nach konkreter Situation).

2. Es kommt auch vor, dass die Tabellen in der xml-Datei ineinander verschachtelt oder nicht sauber aufgebaut sind.

Mein Vorschlag: Gehe zunächst umgekehrt vor. Erzeuge per Code ein DataSet und DataTables, wie sie aussehen sollten. Speichere mit WriteXmlSchema die Struktur und vergleiche diese xsd-Datei mit der vorhandenen xml-Datei. Wenn das auch noch nichts hilft, dann erzeuge in jeder DataTable per Code zwei Zeilen und speichere alles per WriteXml ab und vergleiche nochmals.

Gruß Jürgen
yndaso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mi 24.03.10 12:05 
Hallo,
ich erzeuge die xml Datei aus einem php Skript heraus.
Ich habe dazu keine Schemadatei...

Hier mal eine abgekürzte Version der xml Datei:
ausblenden 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:
24:
25:
26:
27:
<?xml version='1.0' encoding='ISO-8859-1'?>
<Database>
 <Termine>
      <ID>1</ID>
      <Date>2009-11-20</Date>
      <Description>Text 1</Description>
    </Termine>
  <Termine>
      <ID>2</ID>
      <Date>2009-12-24</Date>
      <Description>Text2</Description>
    </Termine>
  <Termine>
      <ID>3</ID>
      <Date>2009-02-02</Date>
      <Description>Text 3</Description>
    </Termine>
  <Aufnahme>
      <ID>1</ID>
      <Description>Aufnahmegebühr für Erwachsene</Description>
      <Price>50</Price>
    </Aufnahme><Aufnahme>
      <ID>2</ID>
      <Description>Aufnahmegebühr für Jugendliche</Description>
      <Price>25</Price>
    </Aufnahme>
 </Database>
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 24.03.10 12:15 
Dann ist es eindeutig: Das DataSet kann damit nichts anfangen. Es weiß weder, dass "Termine" und "Aufnahme" die Namen von Tabellen sind, dass "ID" usw. die Namen von Spalten sind noch von welchem Datentyp diese Spalten sein sollen. Als Menschen können wir all das vermuten, aber ein Computer ist dafür zu dumm.

Deshalb ist mein obiger Vorschlag vernünftig: Mache per Code ein DataSet mit Daten, speichere Schema und Inhalt ab (zum Ausprobieren sowohl getrennt als auch gemeinsam); dann weißt du, wie die xml-Datei auszusehen hat.

Gruß Jürgen
yndaso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mi 24.03.10 12:37 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Deshalb ist mein obiger Vorschlag vernünftig: Mache per Code ein DataSet mit Daten, speichere Schema und Inhalt ab (zum Ausprobieren sowohl getrennt als auch gemeinsam); dann weißt du, wie die xml-Datei auszusehen hat.


Ok, ich habe nun auf die Schnelle mir so ein DataSet erstellen lassen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
            string path2 = @"..\database2.xml";
            string path3 = @"..\database2.xsd";

            DataTable tabelle = new DataTable();
            tabelle.Columns.Add("ID"typeof(int));
            tabelle.Columns.Add("Datum"typeof(string));
            tabelle.Columns.Add("Bezeichnung"typeof(string));
            tabelle.Rows.Add(25"Hallo""Juhu");
            tabelle.Rows.Add(50"string""Test");
            DataSet ds = new DataSet();
            ds.Tables.Add(tabelle);
            ds.WriteXml(path2);
            ds.WriteXmlSchema(path3);

Das ergibt folgende xml Datei:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
  <Table1>
    <ID>25</ID>
    <Datum>Hallo</Datum>
    <Bezeichnung>Juhu</Bezeichnung>
  </Table1>
  <Table1>
    <ID>50</ID>
    <Datum>string</Datum>
    <Bezeichnung>Test</Bezeichnung>
  </Table1>
</NewDataSet>

Und folgende xsd Schema Datei:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
<?xml version="1.0" standalone="yes"?>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Table1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ID" type="xs:int" minOccurs="0" />
              <xs:element name="Datum" type="xs:string" minOccurs="0" />
              <xs:element name="Bezeichnung" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>


Sieht soweit ganz gut aus, nun lese ich wie du gesagt hattest sowohl das Schema als auch die
xml Datei, aber das DataGridView ist immer noch leer:
ausblenden C#-Quelltext
1:
2:
3:
4:
            dataSet1.ReadXmlSchema(path3);
            dataSet1.ReadXml(path2);           
            this.dataGridView1.DataSource = dataSet1;
            dataGridView1.DataMember = dataSet1.Tables[0].TableName;


Was mache ich noch falsch?
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 24.03.10 13:18 
Was du falsch gemacht hast, weiß ich nicht. Bei mir funktioniert es so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
DataSet dataSet1;

void MainFormLoad(object sender, EventArgs e)
{
      string path2 = @"..\database2.xml";
            string path3 = @"..\database2.xsd";
            dataSet1 = new DataSet();
            dataSet1.ReadXmlSchema(path3);
            dataSet1.ReadXml(path2);           
            dataGridView1.DataSource = dataSet1;
            dataGridView1.DataMember = dataSet1.Tables[0].TableName;
}

Vielleicht passen deine beiden Code-Teile nicht mehr zusammen, vor allem, weil du mit Tables[] auf den Index 0 zugreifst. Im Ernstfall solltest du sowieso den Namen benutzen.

Gruß Jürgen
yndaso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mi 24.03.10 13:34 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

Vielleicht passen deine beiden Code-Teile nicht mehr zusammen, vor allem, weil du mit Tables[] auf den Index 0 zugreifst. Im Ernstfall solltest du sowieso den Namen benutzen.


Ah ich hatte im Entwurf noch ein Binding angeben und das DGV editiert.
Nun hab ich es rausgeschmissen und ein DGV "von Hand" ins Form gelegt und nun geht das.

Eine Verständnissfrage noch:

Wenn der Benutzer im DGV nun einige Werte ändert oder Zeilen hinzufügt.
Wird durch das DataBinding dann die Werte direkt im DataSet geändert oder muss
man noch manuell das DataSet aktuallisieren?

Und danke für deine Hilfe!
yndaso Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 108



BeitragVerfasst: Mi 24.03.10 14:14 
Habs selbst mal ausprobiert!
Klappt alles wie gewünscht!

Danke
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 24.03.10 14:26 
Die allerletzte Änderung wird nicht immer automatisch übernommen: Wenn die aktuelle Zeile im DGV gewechselt wird, dann werden die Änderungen im DataSet/DataTable aktualisiert. Wenn du dich aber noch in der letzten, geänderten Zeile befindest und z.B. den Speichern-Button drückst, fehlen diese Änderungen. Du benötigst noch BindingSource.EndEdit oder DGV.EndEdit.

Gruß Jürgen