IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[DEBUTANT]XML & DataGridView petit probleme.


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut [DEBUTANT]XML & DataGridView petit probleme.
    Bonjour toutes et a tous !

    Voila je suis debutant et j'ai un petit soucis avec le xml et les datagrid
    j'aimerai afficher le contenu de mon fichier xml dans un datagrid mais j'ai ce message d'erreur :

    "L'execption NullReferenceException n'a pas été gérée
    La référence d'objet n'est pas définie à une instance d'un objet."

    à la ligne que je vous ai mis en gras.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    private void Form1_Load(object sender, EventArgs e)
            {
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load("sample.xml");
    
                XmlNodeList xmlName = xmlDoc.GetElementsByTagName("name");
                XmlNodeList xmlContact = xmlDoc.GetElementsByTagName("contatcnumber");
                XmlNodeList xmlEmail = xmlDoc.GetElementsByTagName("email");
    
                dataGridView1.Columns.Add("Name", "Name");
                dataGridView1.Columns.Add("Contact Number", "Contact Number");
                dataGridView1.Columns.Add("Email", "Email");
                int i = 0;
    
                while (i < xmlName.Count)
                {
                    object[] data = {(object)xmlName.Item(i).InnerText, (object)xmlContact.Item(i).InnerText, (object)xmlEmail.Item(i).InnerText };
                    dataGridView1.Rows.Add(data);
                    i++;
                }
            }
    je vous remerci par avance de votre aide !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Euh... ta façon d'analyser le fichier XML me parait un peu hasardeuse ! tu peux montrer la structure du fichier ?

    Sinon, vu que string hérite de object (comme toutes les classes d'ailleurs), pas la peine de faire un cast de InnerText en object...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Merci de ta reponse !

    Voici mon fichier xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <company>
    	<employee>
    		<name>John Doe</name>
    		<contactnumber>555-5656</contactnumber>
    		<email>johndoe@mail.com</email>
    	</employee>
    	<employee>
    		<name>Sue Baily</name>
    		<contactnumber>555-5124</contactnumber>
    		<email>suebaily@mail.com</email>
    	</employee>
    	<employee>
    		<name>Tom Baker</name>
    		<contactnumber>555-9867</contactnumber>
    		<email>tombaker@mail.com</email>
    	</employee>
    	<employee>
    		<name>Jane Smith</name>
    		<contactnumber>555-1167</contactnumber>
    		<email>janesmith@mail.com</email>
    	</employee>
    </company>

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    OK...
    Je vois pas trop ce qui pose problème, mais en tous cas tu devrais modifier ta façon d'accéder aux éléments... suppose par exemple, que l'élément <email> soit manquant pour un des employés : dans ce cas tu n'auras plus le même nombre d'éléments dans xmlName et xmlEmail, et tout sera décalé à partir de cet employé... Il vaudrait mieux travailler par rapport à l'élément <employee>, et récupérer les infos de chaque employé à partir de l'élément employee correspondant.

    Sinon, personnellement j'aurais plutôt adopté une autre méthode, en utilisant la sérialisation XML...
    • Tu définis une classe qui correspond à company, et une autre qui correspond à employee, en mettant des attributs de sérialisation pour que ça corresponde au schéma XML :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      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
       
      ...
      using System.Xml.Serialization;
      ...
       
      [XmlRoot("employee")]
      public class Employee
      {
          [XmlElement("name")]
          public string Name { get; set; }
          [XmlElement("contact")]
          public string Contact { get; set; }
          [XmlElement("email")]
          public string Email { get; set; }
      }
       
      [XmlRoot("company")]
      public class Company
      {
          public Company()
          {
              this.Employees = new List<Employee>();
          }
       
          [XmlElement("employee")]
          public List<Employee> Employees { get; private set; }
      }
    • Tu désérialises le fichier pour obtenir un objet Company :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      XmlSerializer xs = new XmlSerializer(typeof(Company));
      Company comp = null;
      using (StreamReader rd = new StreamReader("sample.xml"))
      {
          comp = xs.Deserialize(rd) as Company;
      }
    • Et tu affectes le résultat à la DataSource du DataGridView :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      dataGridView1.DataSource = comp.Employees;

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Merci de ta reponse, merci de m'avoir consacré du temps !
    Etant debutant en c# et encore plus en c# combiné au XML
    je vais me renseigner un peu plus sur ce qu'est la serialisation!

    Encore Merci !

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Me revoilà.. a propos de la sérialisation.

    Après quelque recherche j'ai pu comprendre un peu le principe mais je n'ai pas trouvé d'exemple reflétant vraiment mon projet ce qui me pose quelques soucis pour me lancer...

    J'aimerai savoir comment je dois structuré mes classes de mon fichier XML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <projets>
    	<projet>
    	<titre></titre>
    	<status></status>
    	<priorite></priorite>
    	<budget></budget>
    	<description></description>
    		<taches>
    			<tache>
    				<nom></nom>
    				<description></description>
    				<status></status>
    				<priorite></priorite>
    				<duree></duree>
    				<equipe></equipe>
    				<cout></cout>
    				<sousTraitant></sousTraitant>
    			</tache>
    			<tache>
    				<nom></nom>
    				<description></description>
    				<status></status>
    				<priorite></priorite>
    				<duree></duree>
    				<equipe></equipe>
    				<cout></cout>
    				<sousTraitant></sousTraitant>
    			</tache>
    		</taches>
    	</projet>
    </projets>
    Si quelqu'un pouvais me montrer comment structurer mes classes sa serait super.
    Ce qui me pose reelement problème c'est au niveau des nœuds suivant :
    <projets>
    -----<projet>
    ---------<taches>
    --------------<tache>

    Je vous remercie grandement d'avance !

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Ben en gros tu fais une classe pour chaque élément qui a des noeuds enfants...
    (sauf pour <taches> qui est une collection, donc c'est automatique)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Merci,

    Je dois faire une classe projets et une autre projet ?
    Ou simplement une seul ?

    Si j'ai bien compris j'ai deux classes ?
    Classe Projets et Classe tache


    merci d'avance.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    En fait, la classe Projets, c'est juste pour pouvoir changer le nom de l'élément racine, parce que si tu utilises directement une collection de projet, l'élément racine s'appellera ArrayOfprojet.
    Donc il te faut les classes suivantes :
    - Tache
    - Projet
    - Projets

    Donc en gros il te faut ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class Tache
    {
       ...
    }
     
    public class Projet
    {
        ...
     
        [XmlArray("taches")]
        [XmlArrayItem("tache")]
        public List<Tache> Taches { get; set; }
    }
     
    [XmlRoot("projets")]
    public class Projets
    {
        [XmlElement("projet")]
        public List<Projet> Items { get; set; }
    }

    Sinon, une autre possibilité est d'utiliser l'outil xsd.exe (fourni avec le framework) pour générer automatiquement les classes à partir du schéma XSD (mais ça ne génèrera pas forcément le code le plus "pratique" possible...). Si le schéma n'existe pas, je crois que tu peux le générer à partir du XML dans Visual Studio

Discussions similaires

  1. [DEBUTANT] CheckedListBox alimenté par XML (petit probleme)
    Par erigoal dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/02/2009, 23h06
  2. [DEBUTANT] Petit probleme
    Par ChRom dans le forum Débuter
    Réponses: 10
    Dernier message: 16/01/2007, 15h17
  3. [Débutant] Petit problème pour calcul de somme
    Par kriskikout dans le forum Ada
    Réponses: 4
    Dernier message: 04/11/2006, 06h47
  4. Petit problème avec XML et WinDev
    Par MicaelFelix dans le forum WinDev
    Réponses: 1
    Dernier message: 18/09/2006, 16h26
  5. petit probleme de debutant
    Par etudiant72 dans le forum Débuter
    Réponses: 5
    Dernier message: 10/03/2006, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo