Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : [C#] progressBar et chargement de form en même temps [ Windows / UserControl ] (medgha)

lundi 18 août 2008 à 10:49:36 | [C#] progressBar et chargement de form en même temps

medgha

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

mardi 19 août 2008 à 13:03:10 | Re : [C#] progressBar et chargement de form en même temps

TeBeCo

Membre Club
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

mardi 19 août 2008 à 13:04:16 | Re : [C#] progressBar et chargement de form en même temps

TeBeCo

Membre Club
(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

mardi 19 août 2008 à 13:50:25 | Re : [C#] progressBar et chargement de form en même temps

WishhhMaster

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.

mardi 19 août 2008 à 13:55:56 | Re : [C#] progressBar et chargement de form en même temps

medgha

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

mardi 19 août 2008 à 21:55:57 | Re : [C#] progressBar et chargement de form en même temps

medgha

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

mercredi 20 août 2008 à 00:26:16 | Re : [C#] progressBar et chargement de form en même temps

WishhhMaster

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.

mercredi 20 août 2008 à 09:01:03 | Re : [C#] progressBar et chargement de form en même temps

medgha

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

mercredi 20 août 2008 à 12:23:12 | Re : [C#] progressBar et chargement de form en même temps

WishhhMaster

Réponse acceptée !
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();


mercredi 20 août 2008 à 13:37:52 | Re : [C#] progressBar et chargement de form en même temps

medgha

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


1 2

Cette discussion est classé dans : image, chargement, nodes, ico, listeimage


Répondre à ce message

Sujets en rapport avec ce message

[C#]TreeView ne pas associer à tt les nodes une image [ par medgha ] bonjour tt le monde,peut etre que ma question vous paraitra bête, mais j'ai cherché dans le forum et j'ai pas trouvé la reponse,mon problème est le su [C#]treeview node image [ par medgha ] bonjour tout le monde,je dévelope en C# sous visual studio 2005 , j'utilise dans mon application un treeview que je charge à partir d'une base de donn chargement d'une image [ par mathmax ] Bonjour,J'aimerais savoir si il existe un moyen plus performant pour créer un rendu image miniature à partir d'un fichier image. Voici la techique que chargement de grand fichiers image qui bloque la form [ par vboussema ] salu;j'ai un problème qui concerne le chargemen de grandes images (meme les petite :( )dans un picture boxen plus je ne sai pas comment faire pour uti Reduire la taille d'une icone sans perte de precisions [ par warenbe ] bonjour a tous voila j'ai un listview dans lequel je stoque un nom de fichier avec son icone je procede comme ça Icon ico = Icon.ExtractAssociatedIco Une image au demarrage de l'application (le temps du chargement) [ par cycledelique ] Bonjour, Je voudrais savoir comment il était possible d'afficher une image au demarrage de l'application (l'espace de quelques secondes). J'etais tom traitement image binaire [ par vtvdung ] Salut,Je dois coder l'image binaire par l'algorithme QUADTREE. Mais j'ai des difficultés à lire les bits, parce que chaque pixel est codé par un bits. un textbox.text qui ne veux pas se mettre à jour... [ par mathmax ] Bonjour,Voilà mon problème : bien que je change la velaur de textbox.text à chaque passage dans la boucle ci dessous, rien ne se passe lors de l'éxécu Découper une image [ par tomtom41 ] Bonjour à tous,Je dispose d'une image au format TIFF avec différentes informations(sur la même page, une seule page de toute facon).J'aimerais extrair traitement d'image [ par DavDav02 ] Bonjour à tous, J'ai un projet qui consiste à effectuer une capture d'image à l'aide d'une webcam branchée en usb (voir code ci dessous). Jusque là, t


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,640 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.