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 :

[C#] Comment accélérer le chargement d'un treeview


Sujet :

Windows Forms

  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#] Comment accélérer le chargement d'un treeview
    Bonjour,

    J'ai un treeview qui représente l'arborescence de toute la machine (disques, cd, lecteurs réseaux ...)

    Mon problème, c'est que le chargement est très long ... (presque 1 min)
    Je voudrais savoir s'il existe un moyen d'accélérer le chargement.

    Voici comment je charge mon treeView:

    Départ d'un composant BackGroundWorker
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
     
            private void BGW_TREEVIEW_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker bgw = sender as BackgroundWorker;
                TreeNode Machine = Initialize_machineNode();
                bgw.ReportProgress(0, Machine);
                foreach (DriveInfo logicalDrive in _logicalDrives)
                {
                    TreeNode Drive = Initialize_rootNode(logicalDrive);
                    bgw.ReportProgress(1, Drive);
                }
            }
     
     
            //Initialisation de noeud MACHINE
            private TreeNode Initialize_machineNode()
            {
                TreeNode MachineNode = new TreeNode();
                MachineNode.Name = _machine;
                MachineNode.Text = _machine;
                MachineNode.ImageKey = "tree_computer";
                return MachineNode;
            }
     
     
            //Initialisation d'un noeud et de ses enfants pour un lecteur
            private TreeNode Initialize_rootNode(DriveInfo driveInfo)
            {
                TreeNode Drive = new TreeNode();
                Drive = CreateDrive(driveInfo);
                CreateNode(Drive);
                return Drive;
            }
     
            //Création des noeuds pour les lecteurs 
            private TreeNode CreateDrive(DriveInfo drive)
            {
                TreeNode tn = new TreeNode();
                try
                {
                    tn.Name = drive.Name;
                    tn.Text = drive.Name;
                    tn.Tag = drive.Name;
     
                    tn.ToolTipText = "Lecteur: " + drive.DriveType.ToString() + "\n";
                    tn.ToolTipText += "Espace total: " + (drive.TotalSize / 1000000).ToString("00.00") + " Mo\n";
                    tn.ToolTipText += "Espace libre: " + (drive.AvailableFreeSpace / 1000000).ToString("00.00") + " Mo";
                    tn.ImageKey = SetDriveImageKey(drive);
                }
                catch (Exception e)
                {
                    new Error().Write(e);
                    tn.Name = drive.Name;
                    tn.Text = drive.Name;
                    tn.Tag = drive.Name;
                    tn.ToolTipText = "Lecteur: ? \n";
                    tn.ToolTipText += "Espace total: ? \n";
                    tn.ToolTipText += "Espace libre: ? ";
                    tn.ImageKey = SetDriveImageKey(drive);
     
                }
                return tn;
            }
     
            //Création des noeuds enfants (fonction récursive)
            private void CreateNode(TreeNode Father)
            {
                try
                {
                    foreach (DirectoryInfo dir in new DirectoryInfo(Father.Tag.ToString()).GetDirectories())
                    {
                        TreeNode tn = new TreeNode();
                        tn.Name = dir.FullName;
                        tn.Tag = dir.FullName;
                        tn.Text = dir.Name;
                        tn.ToolTipText = "Dernière modification: " + dir.LastWriteTime.ToLongDateString();
                        tn.ImageKey = "tree_document_closed";
                        Father.Nodes.Add(tn);
                        _totalDirectoryInSystem++;
                        CreateNode(tn);
                    }
                }
                catch (Exception e)
                {
                    new Error().Write(e);
                }
            }


    Merci beaucoup pour votre aide !!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    324
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 324
    Points : 343
    Points
    343
    Par défaut
    Bonjour,
    Raccourcir le temps d'execution ?
    Deux possibilités :

    -1ere solution : Troquer son disque dur de 250 Go contre un de 3Go (ça sera moins long )

    -2eme solution un peu moins stupide : Faire du multithread en faisant encore un autre thread pour l'operation qui prend le plus de temps. J'ai vu un article sur la msdn interessant pour decomposer tes chargements de TreeNode en plusieurs threads concurents. Mais est-ce valable utile pour ton arborescence ?
    Lien MSDN2

    Bon courage.

  3. #3
    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
    Bonjour Ekinox17 !

    Merci pour ta réponse.
    Je vais donc charger mon treeView à partir de plusieurs thread.

    Bonne journée !

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

Discussions similaires

  1. Comment insérer une TextBox dans un TreeView ?
    Par igorzup dans le forum ASP.NET
    Réponses: 3
    Dernier message: 13/11/2007, 17h11
  2. Comment récupérer la scrollBar d'un treeview?
    Par mrrenard dans le forum Windows Forms
    Réponses: 1
    Dernier message: 24/01/2007, 14h40
  3. Réponses: 24
    Dernier message: 23/05/2006, 10h10
  4. Réponses: 2
    Dernier message: 15/05/2006, 11h27
  5. [IB 6.0] Comment accélérer l'accès a la BD ?
    Par mafuku dans le forum InterBase
    Réponses: 2
    Dernier message: 20/12/2005, 11h48

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