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

ASP.NET Discussion :

[C#] Rattacher un treeview à un fichier Xml ou DataSet


Sujet :

ASP.NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [C#] Rattacher un treeview à un fichier Xml ou DataSet
    Bonjour à tous !

    Je voudrais connecté un treeview à une base de données.
    En fait, j'ai deux tables: login et connected
    login contient tous les utilisateurs
    connected contient les utilisateurs connectés

    Le treeview contient deux noeus "connectés" et "déconnectés" et je voudrais remplir chacun de ses noeuds en mettant les utilsateurs connectés sous le noeud "connectés" et les utilisateurs déconnectés sous le noeuds "déconnectés".

    Constatant que je pouvais pas à priori lié directement mes tables à mon treeview, j'ai fait la fonction suivante qui récupère de mes bases deux tableaux: le tableau contenant les utilisateurs connectés et le tableau contenant les utilisateurs déconnectés.


    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
        public void Load_People()
        {
            //Sélection de tous les utilisateurs
            //La connexion
            BD bd1 = new BD();
            OdbcConnection con1 = bd1.Connect();
     
            //Initialisation dataset 1 et dataAdapter 1 (récupération de tous les users)
            DataSet oDataSet1 = new DataSet("AllUsers");
            OdbcDataAdapter oDataAdapter1 = new OdbcDataAdapter("SELECT LOGIN FROM login",con1);
            oDataAdapter1.Fill(oDataSet1, "AllUsers");
     
            //Initialisation dataset 2 et dataAdapter 2 (récupération users connectés)
            DataSet oDataSet2 = new DataSet("ConnectedUsers");
            OdbcDataAdapter oDataAdapter2 = new OdbcDataAdapter("SELECT LOGIN FROM connected", con1);
            oDataAdapter2.Fill(oDataSet2, "ConnectedUsers");
            //Arraylist Connected contient les connectés
            //Arraylist Disconnected contient les non connectés
            ArrayList Connected = new ArrayList();
            ArrayList Disconnected = new ArrayList();
     
            //on remplit les deux arraylist en fonctions des données de la table
            for (int i = 0; i < oDataSet1.Tables["AllUsers"].Rows.Count; i++)
            {
                Connected.Add(oDataSet1.Tables["AllUsers"].Rows[i][0].ToString());
                for (int j = 0; j < oDataSet2.Tables["ConnectedUsers"].Rows.Count; j++)
                {
                    if (oDataSet2.Tables["ConnectedUsers"].Rows[j][0].ToString() == oDataSet1.Tables["AllUsers"].Rows[i][0].ToString())
                    {
                        Connected.Remove(oDataSet1.Tables["AllUsers"].Rows[i][0].ToString());
                        Disconnected.Add(oDataSet1.Tables["AllUsers"].Rows[i][0].ToString());
                    }
                }
            }
     
            //Conversion des arraylist en string[];
            string[] conn = (string[])Connected.ToArray(typeof(string));
            string[] disconn = (string[])Disconnected.ToArray(typeof(string));
     
            for (int i = 0; i < conn.Length; i++)
            {
                Response.Write("Connected: " + conn[i]+"<BR>");
            }
            for (int i = 0; i < disconn.Length; i++)
            {
                Response.Write("Disconnected: " + disconn[i] + "<BR>");
            }
    Jusque là, ça va mais je me pose plusieurs questions:

    1. Est-ce que c'est le meilleur moyen, n'y a t'il pas un moyen plus rapide pour faire cela.
    2. J'ai vu qu'on pouvait lié un treview à un fichier xml. Dans ce cas, comment créé un fichier xml (ou updaté) à partir des deux tableaux ou mieux (si c'est possible) à partir de mes deux datasets.


    Merci beaucoup pour vos réponses !!
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Salut,

    2. J'ai vu qu'on pouvait lié un treview à un fichier xml. Dans ce cas, comment créé un fichier xml (ou updaté) à partir des deux tableaux ou mieux (si c'est possible) à partir de mes deux datasets.
    monDataset.Save(@"c:\monfichierxml.xml");

  3. #3
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    pfff la code de ouf !!
    Pourquoi convertir un dataset en arraylist pour le reconvertir en string[] ??

    Pourquoi ne pas itérer directement sur ton dataset ??

    et 2) pouquoi 2 dataset alors qu'un seul avec 2 tables suffirait ???

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Salut Guitoux et merci pour ta réponse rapide.
    Tu as dit:
    et 2) pouquoi 2 dataset alors qu'un seul avec 2 tables suffirait ???
    En fait je ne sais pas comment faire ma requête pour récupérer ce que je veux dans mon dataset.

    Ma table login contient tous les utilisateurs
    Ma table connectés contient les connectés

    Il faut que je récupère dans un dataset, les connectés et les déconnectés.

    C'est possible de faire cela ?

    Dans ce cas, oui, ce code est débile...

    Tu as dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Pourquoi convertir un dataset en arraylist pour le reconvertir en string[] ??
    c'est vrai ça !!!
    tout le monde est d'accord pour critiquer la pensée unique

  5. #5
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    DataSet oDataSet = new DataSet("MonDataSet");
    OdbcDataAdapter oDataAdapter = new OdbcDataAdapter("SELECT LOGIN FROM login",con1);
    oDataAdapter.Fill(oDataSet, "AllUsers");
    oDataAdapter = new OdbcDataAdapter("SELECT LOGIN FROM connected", con1);
    oDataAdapter.Fill(oDataSet, "ConnectedUsers");
    Le second paramètre du OdbcDataAdapter.Fill() correspond au nom de la table où stocker les données.

    Donc la avec ce code tu créer 1 dataset (mondataset) avec 2 table. une table 'AllUsers et une table "ConnectedUsers"

    Question : pourquoi dans la BDD ta deux tables ?
    Pourquoi pas une seule table "sers" avec un attribut "Connected" type booléen (et même en plus en attribut DateTime indiquant la date de connection)

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Guitoux, c'est génial, ça marche !!! Enfin presque.
    Je n'ai pas voulu utliser une seule table login dans laquelle j'aurai rajouté un bool d'état de connexion car je voulais pas faire de requête d'update sur cette table. C'est peut-être idiot après tout.

    Toujours est il que j'ai suivi tes conseils et j'ai fait cela:

    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
     
            BD bd1 = new BD();
            OdbcConnection con1 = bd1.Connect();
     
            DataSet oDataSet;
            OdbcDataAdapter oDataAdapter;
            oDataSet = new DataSet("MyDataSet");
     
            oDataAdapter = new OdbcDataAdapter("SELECT l.LOGIN FROM login l, connected c WHERE l.LOGIN!=c.LOGIN",con1);
            oDataAdapter.Fill(oDataSet, "Diconnected");
     
     
            oDataAdapter = new OdbcDataAdapter("SELECT LOGIN FROM connected", con1);
            oDataAdapter.Fill(oDataSet, "Connected");
     
            oDataSet.WriteXml("c:\\inetpub\\wwwroot\\MySite\\data\\treeview.xml");
    Ce qui est d'une part beaucoup plus court et beaucoup plus lisible que ce que j'avais fait avant !!

    J'obtiens donc le fichier treeview.xml suivant:
    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
     
    <?xml version="1.0" standalone="yes"?>
    <MyDataSet>
      <Diconnected>
        <LOGIN>lala</LOGIN>
      </Diconnected>
      <Diconnected>
        <LOGIN>test1</LOGIN>
      </Diconnected>
      <Diconnected>
        <LOGIN>test2</LOGIN>
      </Diconnected>
      <Diconnected>
        <LOGIN>test3</LOGIN>
      </Diconnected>
      <Connected>
        <LOGIN>test0</LOGIN>
      </Connected>
    </MyDataSet>
    Fichier qui est vrai su reste.

    Mais j'ai un problème lorsque je lie ce fichier à mon treeview.
    Moi, je voudrais 2 noeuds parents (connected et disconnected)
    Et sous chacun de ces noeuds parents, tous les login qui y sont rattachés.
    C'est à dire, pour cet exemple, ça:
    MyDataset
    Connected
    test0
    Disconnected
    test1
    test2
    test3
    lala
    Mais là, j'obtiens ça:
    MyDataSet
    Connected
    test0
    Disconnected
    test1
    Disconnected
    test2
    Disconnected
    test3
    Disconnected
    lala
    tout le monde est d'accord pour critiquer la pensée unique

  7. #7
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    la c'est plus spécifique au treeview que je ne connais pas trop. Mais je te conseillerais d'alimenter ton treeview à la main à partir de ton dataset, plutot que de créer un .xml et d'alimenter le treeview automatiquement.

    En effet, les controles .Net sont génériques, ils ont étés créés pour répondre aux cas les plus commun. Or ton cas est moins commun, donc faut mettre la main dans le paté pour faire ce qu'un veut.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Guitoux,
    je m'en suis sorti en gardant le "binding" (si on dit comme ça) entre le treeview et le fichier xml.

    J'ai gardé le dataset puis j'ai récupérer ses valeurs que j'ai écrit dans un fichier xml.
    ça donne ç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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
            BD bd1 = new BD();
            OdbcConnection con1 = bd1.Connect();
     
            DataSet oDataSet;
            OdbcDataAdapter oDataAdapter;
            oDataSet = new DataSet("MyDataSet");
     
            oDataAdapter = new OdbcDataAdapter("SELECT l.LOGIN FROM login l, connected c WHERE l.LOGIN!=c.LOGIN GROUP BY l.login",con1);
            oDataAdapter.Fill(oDataSet, "Disconnected");
     
     
            oDataAdapter = new OdbcDataAdapter("SELECT LOGIN FROM connected GROUP BY LOGIN", con1);
            oDataAdapter.Fill(oDataSet, "Connected");
     
     
            XmlTextWriter filexml = new XmlTextWriter("c:\\inetpub\\wwwroot\\MySite\\data\\treeview.xml", null);
            filexml.WriteStartDocument();
            filexml.WriteWhitespace("\n");
     
            filexml.WriteWhitespace("\t");
     
            filexml.WriteStartElement("DataSet");
            filexml.WriteStartElement("Disconnected");
            for (int i = 0; i < oDataSet.Tables["Disconnected"].Rows.Count; i++)
            {
                filexml.WriteStartElement("Login");
                filexml.WriteWhitespace("\n\t\t\t");
                filexml.WriteString(oDataSet.Tables["Disconnected"].Rows[i][0].ToString());
                filexml.WriteWhitespace("\n\t\t\t\t\t\t");
                filexml.WriteEndElement();
            }
            filexml.WriteEndElement();
     
            filexml.WriteStartElement("Connected");
            for (int i = 0; i < oDataSet.Tables["Connected"].Rows.Count; i++)
            {
                filexml.WriteStartElement("Login");
                filexml.WriteWhitespace("\n\t\t\t");
                filexml.WriteString(oDataSet.Tables["Connected"].Rows[i][0].ToString());
                filexml.WriteWhitespace("\n\t\t\t\t\t\t");
                filexml.WriteEndElement();
            }
            filexml.WriteEndElement();
            filexml.WriteEndElement();
            filexml.Close();
    C'est une solution, sûrement pas la meilleure mais ça fonctionne ...
    Merci grandement pour ton aide !!!!
    tout le monde est d'accord pour critiquer la pensée unique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Enregistrer un treeview dans un fichier XML
    Par bugland dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 18/01/2012, 12h55
  2. Sauvegarder une Treeview dans un fichier XML ?
    Par alavoler dans le forum Windows Forms
    Réponses: 6
    Dernier message: 25/03/2008, 16h47
  3. [WPF][Binding] Comment binder un fichier XML sur un treeview?
    Par bakonu dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 26/11/2007, 17h09
  4. Affichre un fichier xml dans un treeview
    Par bath dans le forum Visual C++
    Réponses: 3
    Dernier message: 18/03/2007, 23h30
  5. [C#] Problème chargement fichier xml dans treeview
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/06/2006, 14h10

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