xml Binding Datagrid

  • WPF

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    xml Binding Datagrid

    Ich möchte eine XML Datei an ein Datagrid binden.

    gegeben:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <personendaten>
    3. <person>
    4. <id>1</id>
    5. <vorname>Leonardo</vorname>
    6. <lastName>DiCaprio</lastName>
    7. <geboren>27.05.1969</geboren>
    8. </person>
    9. <person>
    10. <id>2</id>
    11. <vorname>Johnny</vorname>
    12. <lastName>Depp</lastName>
    13. <geboren>01.06.1980</geboren>
    14. </person>
    15. <person>
    16. <id>3</id>
    17. <vorname>Hritik</vorname>
    18. <lastName>Roshan</lastName>
    19. <geboren>05.08.1940</geboren>
    20. </person>
    21. </personendaten>


    XML-Quellcode

    1. <Grid>
    2. <DataGrid ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="True">
    3. <DataGrid.DataContext>
    4. <XmlDataProvider
    5. Source="daten.xml"
    6. XPath="personendaten/person"/>
    7. </DataGrid.DataContext>
    8. </DataGrid>
    9. </Grid>


    Das Ergebnis ist unbefriedigend. Das DataGrid soll die Tabellen: ID, vorname, nachname, geboren selbst erstellen; macht es aber nicht.

    Es geht hier wirklich nur um Grundlagenwissen; keine "ausgefeilten Methoden".
    Bilder
    • Ergebnis.PNG

      15,99 kB, 603×222, 210 mal angesehen
    • ordnerstr.PNG

      9,16 kB, 228×214, 201 mal angesehen

    Thomas2705 schrieb:

    <DataGrid ItemsSource="{Binding}"


    Hallo
    ​Zeigst du uns auch deine Klasse an welche du Bindest (DataContext des Mainwindow) ?
    ​Wenn ich mir den Screenshot ansehe hast du deine MainWindow.vb ja als DartaContext.

    PS: Sag gleich dazu wie du die XML einliest, Serializer oder manuell?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Sascha; so eine Klasse habe ich nicht. Ich nahm an das ein Binding nur im XAML ausreicht ohne vb.
    PS: Sag gleich dazu wie du die XML einliest, Serializer oder manuell?

    Die xml habe ich "von Hand geschrieben"

    Nachtrag: Ich habe es um diesen Code ergänzt aber es ist falsch. Ich finde kein Beispiel zum Erstellen einer solchen Klasse.

    VB.NET-Quellcode

    1. Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    2. Dim MyKontakte As XElement = XElement.Load("Daten.xml")
    3. DataGrid_Personen.DataContext = MyKontakte.Elements("personen")
    4. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thomas2705“ ()

    Hallo

    Das geht so nicht wie du gedacht hast, du musst die XML "well" Formated haben.
    Anschließend musst du in der jeweiligen Spalte bekanntgeben welches Attribut aus der XML für die Daten hergenommen werden soll.

    Hier ein Beispiel für folgende XML:

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <persons>
    3. <person id="1" Firstname="Leonardo" Lastname="DiCaprio" Birthday="27.05.1969"/>
    4. <person id="1" Firstname="Max" Lastname="Mustermann" Birthday="01.08.1983"/>
    5. </persons>


    XML-Quellcode

    1. <Grid>
    2. <Grid.Resources>
    3. <XmlDataProvider x:Key="TestDate" Source="test.xml" XPath="/persons/person"/>
    4. </Grid.Resources>
    5. <DataGrid DataContext="{StaticResource TestDate}" ItemsSource="{Binding}" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True">
    6. <DataGrid.Columns>
    7. <DataGridTextColumn Header="ID" Binding="{Binding XPath=@id}" />
    8. <DataGridTextColumn Header="Vorname" Binding="{Binding XPath=@Firstname}" />
    9. <DataGridTextColumn Header="Nachname" Binding="{Binding XPath=@LastName}" />
    10. </DataGrid.Columns>
    11. </DataGrid>
    12. </Grid>
    13. Ich hoffe jetzt wird es klarer. Wenn du noch Fragen hast melde dich einfach.
    14. Grüße
    15. Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ich habe es etwas abgeändert:

    XML-Quellcode

    1. <DataGrid DataContext="{DynamicResource Personendaten}" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False">
    2. <DataGrid.Resources>
    3. <XmlDataProvider x:Key="Personendaten" Source="Daten.xml" XPath="/personen/person"/>
    4. </DataGrid.Resources>
    5. <DataGrid.Columns>
    6. <DataGridTextColumn Header="id" Binding="{Binding XPath= @id}"/>
    7. <DataGridTextColumn Header="vorname" Binding="{Binding XPath= @vorname}"/>
    8. <DataGridTextColumn Header="nachname" Binding="{Binding XPath= @nachname}"/>
    9. <DataGridTextColumn Header="geboren" Binding="{Binding XPath= @geboren}"/>
    10. </DataGrid.Columns>
    11. </DataGrid>
    12. Vielen Dank für die Hilfe.


    du musst die XML "well" Formated haben.
    Was ist das?
    Was ist das?

    well = Englisch = Gut, wohl, schön.

    Wollte damit sagen das du deine XML so Formatierst das gebunden werden kann.
    Zumindest wenn man keinen Code sondern nur die WPF Interne Funktion nutzen möchte.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Gibt es auch die Möglichkeit die im DataGrid geänderten Daten in die XML Datei zu übernehmen z.B. durch einen Button "Änderungen übernehmen"?

    XML-Quellcode

    1. <Button Content="Änderungen übernehmen"/>


    Ist es auch durch ein Binding ohne vb Code möglich?
    Kannst du mir auch verraten was dir an Code stört?
    Du willst doch programmieren oder?

    Also, hierfür musst du ein wenig abändern. Der XMLDataprovider darf nicht mehr als Resource definiert sein, da du ihn sonst nicht über CodeBehind ansprechen kannst. Weise also dem Grid einen DataContext, Diesen erbt das DataGrid.

    Im Datagrid stellst du sicher das du die Spalten mit einem TwoWay Binding versiehst.
    Und dann eine Zeile Code. Ich weis, du wolltest keinen Code, bitte verzeih mir.

    XML-Quellcode

    1. <Grid>
    2. <Grid.DataContext>
    3. <XmlDataProvider x:Name="xmlData" Source="test.xml" XPath="/persons/person"/>
    4. </Grid.DataContext>
    5. <DataGrid ItemsSource="{Binding Path=. ,Mode=TwoWay}" AutoGenerateColumns="False" IsSynchronizedWithCurrentItem="True">
    6. <DataGrid.Columns>
    7. <DataGridTextColumn Header="ID" Binding="{Binding XPath=@id}" />
    8. <DataGridTextColumn Header="Vorname" Binding="{Binding XPath=@Firstname,Mode=TwoWay}" />
    9. <DataGridTextColumn Header="Nachname" Binding="{Binding XPath=@Lastname,Mode=TwoWay}" />
    10. </DataGrid.Columns>
    11. </DataGrid>
    12. <Button Content="Button" Click="Button_Click" HorizontalAlignment="Left" Margin="435,292,0,0" VerticalAlignment="Top" Width="75"/>
    13. </Grid>


    Visual Basic-Quellcode

    1. Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    2. Me.xmlData.Document.Save("test.xml")
    3. End Sub


    Hoffe ich konnte dir etwas helfen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    <p>Ich danke DIr sehr... und kann es mir erst morgen ansehen (ausprobieren).</p>

    <p>Ist es auch m&ouml;glich einen Datensatz hinzuzuf&uuml;gen? (Aber nein; ich habe gar nichts gegen vb code Xaml scheint mir nur etwas &uuml;bersichtlicher.)</p>

    Thomas2705 schrieb:

    Ist es auch m&ouml;glich einen Datensatz hinzuzuf&uuml;gen?

    Sicher, warum nicht?

    Auch schon versucht zu Googlen? Wenn du dir nur 20 Sekunden Zeit nimmst eine Suchmaschine deiner Wahl zu bemühen könntest du dir SEHR viel Zeit sparen.
    Hast du es denn versucht oder hast du einfach gefragt? Ich unterstütze dich gerne, aber ich unterstütze es nicht wenn es jemand nicht versucht.

    Poste mal deinen Code mit welchem du versucht hast einen Datensatz hinzuzufügen und falls es nicht klappt (gibt dir riug ein paar versuche) dann können wir ja darüber reden was am Code Felerhaft ist.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Entschuldige Bitte das ich Dich noch mal bemühe... aber die Änderung im Datagrid wird nicht in die xml übernommen. Ich habe es nachgebaut, etwas angepaßt und es macht nicht was es soll:

    XML-Quellcode

    1. <Grid>
    2. <Grid.DataContext>
    3. <XmlDataProvider x:Name="Personendaten" Source="Daten.xml" XPath="/personen/person"/>
    4. </Grid.DataContext>
    5. <DataGrid ItemsSource="{Binding Path=.,Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" Margin="0,0,0,167">
    6. <DataGrid.Columns>
    7. <DataGridTextColumn Header="id" Binding="{Binding XPath= @id}"/>
    8. <DataGridTextColumn Header="vorname" Binding="{Binding XPath= @vorname, Mode=TwoWay}"/>
    9. <DataGridTextColumn Header="nachname" Binding="{Binding XPath= @nachname, Mode=TwoWay}"/>
    10. <DataGridTextColumn Header="geboren" Binding="{Binding XPath= @geboren, Mode=TwoWay}"/>
    11. <DataGridCheckBoxColumn Header="in Ordnung" Binding="{Binding XPath= @geprüft, Mode=TwoWay}"/>
    12. <DataGridHyperlinkColumn Header="Page" Binding="{Binding XPath= @Page, Mode=TwoWay}"/>
    13. </DataGrid.Columns>
    14. </DataGrid>
    15. <Button Content="Änderungen übernehmen" Height="23" HorizontalAlignment="Left" Margin="0,150,0,0" Name="Button1" VerticalAlignment="Top" Width="153" Click="Button1_Click" />
    16. </Grid>


    VB.NET-Quellcode

    1. Me.Personendaten.Document.Save("Daten.xml")


    ...beim Hinzufügen bin ich noch nicht.
    Hallo

    Sollte tun. Bist du sicher das du das Editieren beendest??
    Schreibe mal eine Zelle um und gehe dann in eine andere. Speichern, und dann in der XML nachsehen.

    Sonst lade ich dir ein Projekt hoch.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Könnte sein, das die xml-Datei an einem anderen Ort ist. In

    VB.NET-Quellcode

    1. Me.Personendaten.Document.Save("Daten.xml")


    muss der Pfad exakt der der Xml-Datei entsprechen. Sowas ist also auch möglich, wenn die Xml-Datei nicht im Debug/Release Ordner ist, sondern vorne bei all anderen Dateien.

    VB.NET-Quellcode

    1. Me.Personendaten.Document.Save("..\..\Daten.xml")



    Freundliche Grüsse

    exc-jdbi
    Was ich mir eher vorstellen könnte, ist mir gerade eingefallen als @exc-jdbi das geschrieben hat, das du evtl. entweder nicht den die Buildart auf Inhalt gestellt hast oder, noch warscheinlicher, das du bei "In Ausgabeverzeichniss kopieren" auf Immer anstatt auf Wen neuer bist. Jetzt startest du warscheinlich der einfachheit halber das Proggi neu und es ist alles beim alten ?(

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    muss der Pfad exakt der der Xml-Datei entsprechen.
    Ja jetzt funktioniert es. Die Datei ist vorn bei all den anderen Dateien. Wo ist den "hinten" der richtigste Platz; bei debug oder relase?

    VB.NET-Quellcode

    1. Me.Personendaten.Document.Save("..\..\Daten.xml")


    Buildart auf Inhalt gestellt hast
    steht hier auf Resource und funktioniert auch bei Inhalt.

    bei "In Ausgabeverzeichniss kopieren" auf Immer anstatt auf Wen neuer bist.
    Das verstehe ich nicht? Was meinst Du?
    Morgen

    Thomas2705 schrieb:

    Das verstehe ich nicht? Was meinst Du?



    Thomas2705 schrieb:

    Wo ist den "hinten" der richtigste Platz

    Solange du keine Ordner in der Solution hast sollte es ohne ../.. gehen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Guten Morgen @Thomas2705

    Einstellungen des Konfigurations-Pfades findet man so. (Build output path)



    Die aktive bzw. die im Moment eingestellte Konfiguration (also Debug oder Release)


    Je nachdem ob die Konfiguration Debug oder Release eingestellt ist, ist der entsprechende Pfad bei mir also
    C:ProjektPfad\bin\[Debug oder Release]

    Der richtige Platz für die Xml-Datei ist je nachdem wie der Effekt sein soll, unter Beachtung natürlich von dem was Sasha oben beschrieben hat. Das automatisch Einkopieren, muss ja nicht immer den gewünschten Effekt mit sich bringen. Ander seits kann es auch gewollt sein, um die OriginalDaten nicht zu verändern.

    Ich hoffe ich konnte helfen.

    Freundliche Grüsse

    exc-jdbi