[asp][1.1] XML et datagrid

XML et datagrid [asp][1.1] - C#/.NET managed - Programmation

Marsh Posté le 22-08-2006 à 10:16:18    

Bonjour tout le monde,
 
Je dispose d'un fichier xml comme ceci:
 
 

Code :
  1. <?xml version="1.0" standalone="yes"?><regions>
  2.    <region idRegion="0" nomRegion="Région 0">
  3.       <serveur ipServeur="XX.XX.XX.XX">
  4.          <idServeur>01</idServeur>
  5.          <type>Consolidation</type>
  6.          <nomServeur>Serveur_00_01</nomServeur>
  7.       </serveur>
  8.    </region>
  9.    <region idRegion="1" nomRegion="Région 1">
  10.       <serveur ipServeur="XX.XX.XX.XX">
  11.          <idServeur>01</idServeur>
  12.          <type>BDD</type>
  13.          <nomServeur>Serveur_01_01</nomServeur>
  14.       </serveur>
  15.       <serveur ipServeur="XX.XX.XX.XX">
  16.          <idServeur>03</idServeur>
  17.          <type>IIS</type>
  18.          <nomServeur>Serveur_01_03</nomServeur>
  19.        </serveur>
  20.    </region>
  21. </regions>


 
 
Je souhaiterai alors afficher dans un dataGrid les informations concernant uniquement les serveurs (c'est à dire une colone pour l'ipServeur, une autre pour l'idServeur, une pour leur type et une quatrième pour leur nom) appartenant à une région dont l'idRegion est stockée dans une variable. Le problème est que je ne sait pas trop comment alimenter mon dataSet afin de ne récupérer que ces noeuds là sachant que après je souhaiterai pouvoir faire les modifier, supprimer...
 
Merci pour votre aide

Reply

Marsh Posté le 22-08-2006 à 10:16:18   

Reply

Marsh Posté le 22-08-2006 à 11:48:52    

Le plus simple :
* tu charges tout ton XML dans un DataSet (ReadXml)
* tu caches les lignes que tu ne veux pas montrer :)   (En overridant OnItemDataBound dans ta custom DataGrid)

Reply

Marsh Posté le 22-08-2006 à 11:59:51    

Salut _Mose_ ! !
 
Merci a toi pour cette idée qui m'a l'air très très bonne :-D
J'avais pas du tout pensé a cette soluce!!
 
Donc charger mon XML dans un dataSet ca pas de soucy je sais faire:
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("monFichier.xml" ));
 
Ensuite afficher le dataSet dans le dataGrid je sais faire aussi:
dataGridServeurs.DataSource = ds.Tables["serveur"];
dataGridServeurs.DataBind();
Donc à ce stage on constate que mon dataGridServeur contient l'ensemble de tous les serveurs et non pas ceux correspondant uniquement à une région dont je connais l'idRegion.
 
Ma question est comment faire pour masquer les lignes en trop???
En gros jai pas compris ca ==> "En overridant OnItemDataBound dans ta custom DataGrid"
 
Merci de bien vouloir eclaircir ce point

Reply

Marsh Posté le 22-08-2006 à 12:14:47    

En fait, tu as deux choix :
1 - Le mieux niveau perfs, (m'enfin si tu as moins de 1000 régions, tu le sentiras pas), c'est de dériver DataGrid pour faire la tienne propre :
* Tu créés une classe MyDataGrid
* Tu surcharges la méthode OnItemDataBound (tape 'override' dans VS.Net, et choisi la méthode dans la liste)
 
2 - Deuxième solution : tu garde le DataGrid de base, et tu t'abonnes à l'évènement 'ItemDataBound'
 
Bon.. une fois que tu as fais ça, dans les deux cas tu as une méthode :
-> qui est appelée à chaque DataRow qui est 'bindé' dans ta grille.
-> qui te fourni un DataGridItemEventArgs , avec une propriété Item très utile  :D  
Je te laisse chercher un peu pour la suite...

Reply

Marsh Posté le 22-08-2006 à 15:16:08    

En fait ca m'a l'air un peu compliqué comme méthode vu mon niveau...
Je me suis donc renseigné et apparement il serai possible de charger tout mon fichier xml dans un dataSet puis de faire un filtre sur celui ci afin de ne conserver que les noeuds qui m'interesserai. J'ai donc essayé  
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("monFichier.xml" ));
DataRow[] rows = ds.Tables["region"].Select("idRegion=1" );
dataGridServeurs.DataSource = rows;
dataGridServeurs.DataBind();
Mais ceci me renvoi un dataGrid avec uniquement deux colonnes et une ligne:
RowError                  |                     HasErrors
                              |                         False
Quelqu'un pourrait-il m'aider??
 
 
 

Reply

Marsh Posté le 23-08-2006 à 10:15:39    

Finalement j'ai  eu recourt à une "astuce" pour résoudre mon problème. J'ai ajouté un attribut à chaque serveur dans mon fichier xml que j'ai appelé idRegion:
 

Code :
  1. <?xmlversion="1.0"standalone="yes"?>
  2. <regions>
  3.    <regionidRegion="0"nomRegion="Region 0">
  4.       <serveuridRegion="0"ipServeur="XX.XX.XX.XX">
  5.          <idServeur>01</idServeur>
  6.          <type>Consolidation</type>
  7.          <nomServeur>Serveur_00_01</nomServeur>
  8.       </serveur>
  9.    </region>
  10.    <regionidRegion="1"nomRegion="Region 1">
  11.       <serveuridRegion="1"ipServeur="XX.XX.XX.XX">
  12.          <idServeur>01</idServeur>
  13.          <type>BDD</type>
  14.          <nomServeur>Serveur_01_01</nomServeur>
  15.       </serveur>
  16.       <serveuridRegion="1"ipServeur="XX.XX.XX.XX">
  17.          <idServeur>03</idServeur>
  18.          <type>IIS</type>
  19.          <nomServeur>Serveur_01_03</nomServeur>
  20.       </serveur>
  21.    </region>
  22. </regions>


 
Pour recupérer mes serveurs appartenant à une certaine région il m'a désormais suffit de faire:
 

Code :
  1. DataSet ds = new DataSet();
  2. ds.ReadXml(Server.MapPath("Regions.xml" ));
  3. DataView dv = new DataView();
  4. dv.Table = ds.Tables["serveur"];
  5. // Je crée mon filtre pour ne récupérer que les serveurs qui m'interresse
  6. dv.RowFilter = "idRegion=" + Session["idRegion"].ToString();
  7. dataGridServeurs.DataSource = dv;
  8. dataGridServeurs.DataBind();


 
Voilà cette méthode fonctionne à merveille si ce n'etait que j'aurai bien aimé trouver la solution sans avoir besoin de modifier mon fichier xml de base, donc si quelqu'un à une idée ;-)


Message édité par supalou le 23-08-2006 à 10:16:54
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed