[C#] progressBar et chargement de form en même temps

Résolu
medgha Messages postés 41 Date d'inscription lundi 22 mai 2006 Statut Membre Dernière intervention 3 mai 2010 - 18 août 2008 à 10:49
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 - 20 août 2008 à 22:06
bonjour tout le monde,
j'ai fait qlq recherches avant de poster,
je développe une application en C# sous visual studio 2005
et j'utilise un treview que je remplie avce une base de données ..jusq'ici tt va bien,
seulement j'ai besoin de mettre des état differents pour mes nodes du troisième niveau ( mon treeview contient 3 niveaux de nodes)
donc je represente ces diffrents états de mes nodes avec des icones, donc j'ai reussi à associé ces icones à mes nodes seulement le chargement de la fenetre est devenu tres lent.
le code que j'ai mi:
ImageList ListeImage = new ImageList();
                ListeImage.Images.Add(Image.FromFile("vide.ico"));//index=0
                ListeImage.Images.Add(Image.FromFile("livre.ico"));//index=1
                ListeImage.Images.Add(Image.FromFile("prepare.ico"));//index=2
                ListeImage.Images.Add(Image.FromFile("encours.ico"));//index=3
                ListeImage.Images.Add(Image.FromFile("nonprepare.ico"));//index=4

                treeView1.ImageList = ListeImage;
//ensuite je change d'cone en fonction de ce que je veux. avec les deux lignes de code suivantes:
MonNode.ImageIndex = 2;
MonNode.SelectedImageIndex = 2;

voila le problème si j'ai bien compri c'est que avce la ligne treeView1.ImageList = ListeImage;( on associe la ListImage à notre treeview seulement il associe en même temps la preumière image (vide.ico) à tout les nodes du treeview et c'est ce qui rend le chargement tres lourd.
donc ma question est es qu'il y'a une manièere d'asssocier des icones à mes nodes sans que j'associe à tout les nodes du treeview?
ou sinon comment faire pour representer une progressbar quii déffile au moment du chargement de la fenetre?
j'ai fai des recherche aussi sur ce sujet mais j'(ai pas reussi.
je vous remercie d'avance.
med

10 réponses

WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
20 août 2008 à 12:23
Salut,

Tu n'as besoin de créer et d'associer ton imageList qu'une seule fois à ton treeview, donc ne mets pas ton code pour ça dans la boucle.

Appelle treeView1.BeginUpdate() avant ta boucle foreach et treeViee1.EndUpdate() après ta boucle.

ImageList ListeImage = new ImageList();
ListeImage.Images.Add(Image.FromFile("vide.ico"));//index=0
ListeImage.Images.Add(Image.FromFile("livre.ico"));//index=1
ListeImage.Images.Add(Image.FromFile("prepare.ico"));//index=2
ListeImage.Images.Add(Image.FromFile("encours.ico"));//index=3
ListeImage.Images.Add(Image.FromFile("nonprepare.ico"));//index=4
 treeView1.ImageList = ListeImage;

treeView1.BeginUpdate();
foreach (DataRow dr in this.DtsGrid1.Tables[0].Rows)
{
    //ton code comme avant sans créer ni associer d'imagelist
}
treeView1.EndUpdate();
3
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
19 août 2008 à 13:03
alors je te dis ca de tete sans etre aller m'en assurer mais il est possible que tu puisse desactiver ca avec une simple propriété de ton treeview pour ca y a pas de secret faut que t'aille lire la doc MSDN dans la liste des membres, je pense que ca doit exister

sinon tu peux contourner le pb de differente maniere :
 * créé une image vide
 * créé une image de 1 px
 * reglé la valeur de l'imageindex a -1 ?
 * créé une classe qui herite de TreeNode et gerer celui directement dans le code appeler en overridant les fonctions utilisées de ce mecanisme (cf la doc)

pour la progress bar c'est gerable a une condition c'est que tu puisses intervenir au niveau du code, comme je ne pense pas qu'il y ai d'indicateur de chargement tu herite de TreeNode tu sais a l'avance le nombre chargé et tu fait un compteur dans le initializecomponent de ta classe comme ca tu connais l'avancement

une autre methode consiste a passer ton control en mode Virtual ce qui te permet pour les grosse liste de donnée de gerer directement la mise en cache des données me semble il
et donc par consequent limité ce soucis

TeBeCo
0
TeBeCo Messages postés 467 Date d'inscription lundi 24 juin 2002 Statut Membre Dernière intervention 9 mars 2011
19 août 2008 à 13:04
(je suis en train de me demander si on peux faire du virtual mode avec un treeview je suis pas certain faut verifier j'ai peut etre parler un peu vite)

TeBeCo
0
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
19 août 2008 à 13:50
Salut,

Tu as essayé de mettre ton code pour créer les nodes entre treeView.BeginUpdate() et treeView.EndUpdate() ? C'est censé stoppé l'affichage pendant que ça ajoute les noeuds, donc ça devrait être plus rapide.

Quand tu as un noeud qui est parent direct pour beaucoup d'autres noeuds, essaye de mettre les noeuds fils dans une liste et utilise nodeParent.AddRange(list) au lieu de node.Add(node) pour chacun des noeuds enfants

Un treeview en mode virtuel n'existe pas je crois.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
medgha Messages postés 41 Date d'inscription lundi 22 mai 2006 Statut Membre Dernière intervention 3 mai 2010
19 août 2008 à 13:55
bonjour tt le monde,
je vous remercie pour votre reponse, je vais essayer de mettre en place vos propositions
et je vous tiens au courant.
encore u grand merci
med
0
medgha Messages postés 41 Date d'inscription lundi 22 mai 2006 Statut Membre Dernière intervention 3 mai 2010
19 août 2008 à 21:55
bonjour tt le monde,
désolé pour tt ce retard, en faite je viens de eter ce que vous m'avez proposer et je ne vois pas de changement.
j'ai essayé:
* créé une image vide
 * créé une image de 1 px
 * reglé la valeur de l'imageindex a -1 ?
ainsi que mettre le code de création des nodes entre beguinUpdate(); et endUpdate();
par contre je sais pas comment je peux m'y prendre pour essayer :* créé une classe qui herite de TreeNode et gerer celui directement dans le code appeler en overridant les fonctions utilisées de ce mecanisme (cf la doc)
merci d'avance pour votre aide
med
0
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
20 août 2008 à 00:26
Salut,

Par curiosite tu as combien de nodes en tout? Et tu n'appelles bien beginupdate et endupdate qu'une seule fois en tout (desole si c'est bete mais j'ai vu des gens les utiliser pour chaque node)

Tu as essaye AddRange aussi?

Si vraiment rien ne marche oui tu devrais sans doute heriter un TreeView omme tu dis mais je ne suis pas trop sur quelles methodes tu dois redefinir.
0
medgha Messages postés 41 Date d'inscription lundi 22 mai 2006 Statut Membre Dernière intervention 3 mai 2010
20 août 2008 à 09:01
bonjour,
non ta question n'est pas bête...enfaite mon treeview je le remplie de nodes à partir d'une base de donnée..et il y'a en tt a peu pres pres en tt (entre le 1 er niveau , le 2 eme niveau et le 3 eme niveau) 230 nodes...ce qui est baucoup...
pour beguinUpdate et endUpdate...j'ai essayé les deux méthodee, c'est a dire je es ai apelé qu'une seule fois et je les apelé aussi plusieurs fois et ça ne marche tjrs pas...je vais essayer encore avce cette méthode peu etre que la dernièere foi sj'ai mal fait choses...
pour AddRange je pense que je ne peux pas l'utilisé, car j'utilise un algorithme qui me permet pas de l'utilisé.
par contre pour la derniere option (hériter un TreeView je ne sais pas du tt commenyt m'y prendre...
je vous mes le code comme même peut etre que vous vous pouvez voir mieux que moi...
 ce que fai le code: en faite je remplie mon treeview à partir d'une base de données là j'utilise une table: dans la table je prens le preumlier champ et je l'utilise comme 1 er niveau. et je prens le 2 eme champ de la table et je l'utilise comme 2 eme noiveau( fils des 1er niveau) et je pren un 3eme champ ds ma table et je l'utilise comme 3eme niveau.
et enfaite ds ce 3 eme niveau normalement j'ai 3 états différents en fonction du 4 émé champ de ma table...je sais que c'est un peu compliqué..mais j'espere que j'ai bien expliqué..voila tt je vous reercie encore baucoup
#region treeview

            OleDbDataAdapter DtaGrid1 = new OleDbDataAdapter(this.SqlGrid1, this.Conn);
            //on leve l'exception
            try
            {
                DtaGrid1.Fill(this.DtsGrid1, "EQUIPEMENTS");
            }
            catch (Exception ex)
            {
                //affichage de l'érreur
                MessageBox.Show("Une Erreur est survenue, si cela persiste veuillez contacter au plus vite le programmeur");

                //on ferme la connection
                this.Conn.Close();

                //on quitte l'application
                Application.Exit();
            }
            string RootPrecedent = null;
            string Fils1 = null;
            string Fils1Precedent = null;

            TreeNode NivRoot = null;
            TreeNode NivRootPrecedant = null;
            TreeNode Niv2 = null;
            TreeNode Niv2Precedent = null;
            TreeNode Niv3 = null;

            foreach (DataRow dr in this.DtsGrid1.Tables[0].Rows)
            {
                ImageList ListeImage = new ImageList();
                ListeImage.Images.Add(Image.FromFile("vide.ico"));//index=0
                ListeImage.Images.Add(Image.FromFile("livre.ico"));//index=1
                ListeImage.Images.Add(Image.FromFile("prepare.ico"));//index=2
                ListeImage.Images.Add(Image.FromFile("encours.ico"));//index=3
                ListeImage.Images.Add(Image.FromFile("nonprepare.ico"));//index=4

                treeView1.ImageList = ListeImage;
                //treeView1.SelectedImageIndex = 3;
                //tu recupere ce que tu veux afficher
                string Root = dr[0].ToString();//le root en cours
                if (Root != RootPrecedent)
                {
                    NivRoot = new TreeNode(Root);

                    this.treeView1.Nodes.Add(NivRoot);
                   
                    Fils1 = dr[1].ToString();

                    Niv2 = new TreeNode(Fils1);
                    //tu rajoute un enfant a cette branche root
                    NivRoot.Nodes.Add(Niv2);
                    Niv2.ImageIndex = 1;
                    //n.ChildNodes.Add(n2);
                    Niv3 = new TreeNode(dr[2].ToString());
                    Niv2.Nodes.Add(Niv3);
                    //recuperation de l'ID equipement
                    Niv3.Tag = dr[3].ToString();
                    //Niv3.Text += ("  --  " + dr[3].ToString());
                    Niv3.ForeColor = Color.Blue;
                    //Niv3.ImageIndex = 4;
                    if (dr[4].ToString() == "préparé")
                    {
                        Niv3.ImageIndex = 2;
                        Niv3.SelectedImageIndex = 2; // pour garder la même icone lors de la selection du node
                    }
                   
                    if (dr[4].ToString() == "encours")
                    {
                        Niv3.ImageIndex = 3;
                        Niv3.SelectedImageIndex = 3;
                    }

                    RootPrecedent = Root;
                    NivRootPrecedant = NivRoot;
                    Fils1Precedent = Fils1;

                }
                else
                {
                    Fils1 = dr[1].ToString();
                    if (Fils1 != Fils1Precedent)
                    {
                        Niv2 = new TreeNode(dr[1].ToString());
                        NivRootPrecedant.Nodes.Add(Niv2);
                        Niv2.ImageIndex = 1;
                        string fils2 = dr[2].ToString();

                        //créer le 3 eme niveau
                        Niv3 = new TreeNode(dr[2].ToString());
                        Niv2.Nodes.Add(Niv3);
                        //recuperation de l'ID equipement
                        Niv3.Tag = dr[3].ToString();
                        //Niv3.Text += ("  --  " + dr[3].ToString());
                        Niv3.ForeColor = Color.Blue;
                        //Niv3.ImageIndex = 4;
                        if (dr[4].ToString() == "préparé")
                        {
                            Niv3.ImageIndex = 2;
                            Niv3.SelectedImageIndex = 2; // pour garder la même icone lors de al selection du node
                        }
                       
                        if (dr[4].ToString() == "encours")
                        {
                            Niv3.ImageIndex = 3;
                            Niv3.SelectedImageIndex = 3;
                        }

                        Fils1Precedent = Fils1;
                        Niv2Precedent = NivRootPrecedant;
                    }
                    else
                    {
                        Niv3 = new TreeNode(dr[2].ToString());
                        Niv2.Nodes.Add(Niv3);
                        //recuperation de l'ID equipement
                        Niv3.Tag = dr[3].ToString();
                        //Niv3.Text += ("  --  " + dr[3].ToString());
                        Niv3.ForeColor = Color.Blue;
                        //Niv3.ImageIndex = 4;
                        if (dr[4].ToString() == "préparé")
                        {
                            Niv3.ImageIndex = 2;
                            Niv3.SelectedImageIndex = 2;
                        }

                        if (dr[4].ToString() == "encours")
                        {
                            Niv3.ImageIndex = 3;
                            Niv3.SelectedImageIndex =3;
                        }
                       
                    }
                }
            }
            #endregion

encore merci
med
0
medgha Messages postés 41 Date d'inscription lundi 22 mai 2006 Statut Membre Dernière intervention 3 mai 2010
20 août 2008 à 13:37
je te remercie baucoup,
oui en faite l'idée c'été de mettre le code de création de ImageList et d'association au treeview en dehors de la boucle comme tu l'a mit just dans le message précedent!!!..c'été tt simple, mais il falait y penser..
encore merci merci merci baucoup
med
0
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
20 août 2008 à 22:06
De rien :)
0
Rejoignez-nous