2010-10-20 6 views
1

J'ai cherché autour de cela, mais tous les exemples que j'ai pu trouver utilisaient XAML, ce qui rendait la solution trop statique. Voici ce que je veux faire:Comment lier dynamiquement XML à un DataGrid WPF en C#

Je voudrais remplir les colonnes, les lignes et les attributs d'un DataGrid à partir d'un fichier XML à spécifier lors de l'exécution. Rien sur les attributs du DataGrid ne peut être corrigé; le XML l'enfonce dans les moindres détails (d'où les exemples XAML que j'ai vus ne sont pas suffisants).

Les détails du fichier XML sont ouverts, de sorte que toute disposition fera, mais comme un exemple:

<data> 
    <row Column="Col 1" Value="100" /> 
    <row Column="Col 2" Value ="200" /> 
</data> 

céderais une grille de 2 colonnes du nom de la colonne & Valeur respectivement avec les valeurs ("Col 1 ", 100) & (" Col 2 ", 200) pour la rangée 1 & 2, respectivement.

Encore une fois, je n'ai aucun problème avec XML radicalement différent, donc je vais prendre ce qui fonctionne. Une telle chose semble très utile car elle permettrait la création de composants d'affichage de données génériques dans une variété de domaines. XML offrirait un format générique pratique pour la transmission de données structurées et le DataGrid offrirait une expérience de visualisation riche.

Répondre

0

Vous pouvez sérialiser le code XML dans une collection et lier cette collection.

Vous pouvez créer une table de données à partir de votre fichier XML et l'associer à DataGrid.

Tant que vous avez des données au format maître détail, peu importe quelle structure vous le mettez dans.

Le XML si vous faites comme,

présente les données en lignes et il y a des valeurs de colonnes.

2

Merci à tous ceux qui ont pris le temps de lire ou de répondre à ma demande. J'ai compris comment faire ceci et j'inclus un bout de code ci-dessous:

using System.Xml.Linq; // Required for XElement... 
using System.Collections; // Required for Hashtable 

private void InitGridFromXML(string xmlPath) 
{ 
    var data = XElement.Load(xmlPath); 

    // Set Grid data to row nodes (NOTE: grid = DataGrid member) 
    var elements = data.Elements("row"); 
    grid.ItemsSource = elements; 

    // Create grid columns from node attributes. A hashtable ensures 
    // only one column per attribute since this iterates through all 
    // attributes in all nodes. This way, the grid can handle nodes with 
    // mutually different attribute sets. 
    var cols = new Hashtable(); 
    foreach (var attr in elements.Attributes()) 
    { 
     var col = attr.Name.LocalName; 

     // Only add col if it wasn't added before 
     if (!cols.Contains(col)) 
     { 
      // Mark col as added 
      cols[col] = true; 

      // Add a column with the title of the attribute and bind to its 
      // value 
      grid.Columns.Add(new DataGridTextColumn 
      { 
       Header = col, 
       Binding = new Binding("Attribute[" + col + "].Value") 
      }); 
     } 
    } 
} 
+0

j'aime ceci, merci pour le signaler. Je l'ai ajusté pour les attributs, mais ça a bien fonctionné. –

Questions connexes