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#] groupbox et picturebox


Sujet :

Windows Forms

  1. #1
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut [c#] groupbox et picturebox
    Bonjour,

    dans un groupbox j'ai généré 16 pictureBox.

    Pour un tratement je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    foreach(PictureBox oPictureBox in this.groupBox1.Controls){ // code }
    il me compte les 8 1er picture box et les autres <valeur indefinies> ?!?

    Pourquoi ?

    et que dois je faire pour les avoirs tous ?

    merci

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    je ne sais pas d'ou peut venir ton erreur mais c'est toujours un risque de plantage de faire un for each comme ça.

    Il vaut mieux déclarer une variable de type Control et tester si le type = picturebox au moins pas de plantage possible si il tombe sur un autre type.

    Maintenant je ne pense pas que ça résoudra ton problème, mais tu peux toujours essayer.
    Peut- etre que tu as oublié qqc car ça parait étrange qu'il se trompe en comptant ?!

  3. #3
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    Bizarre oui.
    Lorsuqe je fais un groupBox.Controls.Count j'ai le bon nombre de pictoreBox, mais lorsque je fais un for classique, meme pb.

    Je ne sais plusquoi faire

  4. #4
    SLE
    SLE est déconnecté
    Membre émérite Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Par défaut
    Peux-tu montrer le reste du code ?

  5. #5
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    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 createThumb(string cPictureName){
    			System.Drawing.Bitmap oBitmap;
    			System.Drawing.Bitmap oBitmapTarget;
     
    			if(groupBox1.Controls.Count>0) groupBox1.Controls.Clear();
    			if(groupBox2.Controls.Count>0) listView1.Clear();
     
    			string[] arrayPictureNames;
    			arrayPictureNames = cPictureName.Split(new char [] {';'});
     
    			listView1.CheckBoxes = true;
    			listView1.View = View.Details;
    			listView1.Scrollable = true;
    			listView1.Sorting = SortOrder.Ascending;
     
    			// Creation des colonnes
     
    			ColumnHeader header1, header2; 
    			header1 = new ColumnHeader(); 
    			header2 = new ColumnHeader(); 
     
    			header1.Text = "Aperçu"; 
    			header1.TextAlign = HorizontalAlignment.Left; 
    			header1.Width = 500; 
     
    			header2.TextAlign = HorizontalAlignment.Left; 
    			header2.Text = "Date"; 
    			header2.Width = 150; 
     
    			//Ajout des colonnes
    			listView1.Columns.Add(header1); 
    			listView1.Columns.Add(header2); 
     
    			System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"C:\Inetpub\application\test\wallpaperManagment\fondEcranImage\");
     
    			int nI = 0;
    			int nX = 0;
    			int nY = 0;
    			int nSep = 5;
    			int nLocationX = 120;
    			int nLocationY = 72;
    			int nJ = 0;
     
    			foreach (System.IO.FileInfo fi in di.GetFiles()) {
    				foreach(string cName in arrayPictureNames){
    					if(cName!=fi.Name){
    						// pictureBox1
    						this.pictureBox1 = new System.Windows.Forms.PictureBox();
    						this.pictureBox1.Location = new System.Drawing.Point(16+nX, 24+nY);
    						this.pictureBox1.Name = fi.Name;
    						this.pictureBox1.Size = new System.Drawing.Size(nLocationX, nLocationY);
    						this.pictureBox1.TabIndex = 0;
    						this.pictureBox1.TabStop = false;
    						this.groupBox1.Controls.Add(this.pictureBox1);
     
    						oBitmap = new Bitmap(fi.FullName);
    						oBitmapTarget = new Bitmap(pictureBox1.Width-2,pictureBox1.Height-2);
    						Graphics oGraphics = Graphics.FromImage(oBitmapTarget);
    						oGraphics.DrawImage(oBitmap,new System.Drawing.Rectangle(0, 0, pictureBox1.Width,pictureBox1.Height)); 
     
    						pictureBox1.Name = fi.Name;
    						pictureBox1.Image = (Image) oBitmapTarget;
    						pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click);
     
    						ListViewItem item = new ListViewItem(fi.Name.ToString());
    						item.SubItems.Add(fi.CreationTime.ToString()); 
     
    						listView1.Items.Add(item); 
     
    						nI++;
     
    						if(nI<6){
                                                            nX = nLocationX*nI+nSep*nI;
                                                    }else{
                                                            nI=0;
                                                            nJ++;
                                                            nX=0;
                                                            nY = nLocationY*nJ+nSep*nJ;
                                                    }
    					}
    				}
    			}
    			for(int nM=0;nM<=groupBox1.Controls.Count;nM++){
                                    groupBox1.Controls[nJ].Dispose();
                            }
     
    		}
    Le code bizarre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(int nM=0;nM<=groupBox1.Controls.Count;nM++){
                groupBox1.Controls[nJ].Dispose();
             }
    Il me compte bien le bon nombre de controls mais j'en perd la moitié si je fais par exemple : groupBox1.Controls[nJ].Name

  6. #6
    SLE
    SLE est déconnecté
    Membre émérite Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Par défaut
    OK J'ai compris ce qui ne vas pas...

    Tu dois faire ton dispose() dans le sens inverse (sinon le tableau se tasse et tu sautes 1 ligne sur 2). Donc il faut commencer par la fin du tableau de contrôles, comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int nM=groupBox1.Controls.Count - 1; nM>=0;nM--){ 
                groupBox1.Controls[nM].Dispose(); 
             }
    @+

  7. #7
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    Ton exemple marche et merci à toi.

    Mais je ne comprends pas, car si au lieu de ".dispose()" je fais simplement un ".Name", en gardans ma solution et bien j'ai le meme pb.

    Et pourquoi j'ai le meme pb avec un foreach ?!?

    En tout les cas ta solution marche tout le temps, c'est seulement que j'ai envie de comprendre.

  8. #8
    SLE
    SLE est déconnecté
    Membre émérite Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Par défaut
    Alors là je pige pas non plus !

    J'avais déjà eu ce genre de problème, que j'avais résolu en parcourant le tableau de la fin vers le début, et l'explication que je t'ai donné me semblait la plus logique, mais si .Name ne fonctionne pas non plus alors je suis très intéressé d'avoir l'explication aussi !?!?!

    @+

  9. #9
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    En tout cas merci.

    Si deja grace a ton astuce on regle ce bug, c'est deja mieux que rien.

    Merci

  10. #10
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    J'ai remarqué un truc,

    quand on fait un foreach, le système considère que la collection qu'on parcoure n'est pas modifiée en terme de nombre d'éléments. Donc si on la modifie dans le foreach, soit ca plante, soit il lève une exception.

    En revanche, avec un for(int etc... ca marche bien).
    bien sur il faut partir de la fin, car si on supprime en itérant positivement, en réalité on en supprime 1 sur 2.
    je supprime i,
    i+1 devient donc i,
    je fais i++,
    je supprime i, (donc en fait je suis en train de supprimer le i+2 du i précédent)

  11. #11
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    je suis d'accord avec toi si l'on veut supprimer un element.

    Mais dans mon cas, meme en ne faisant que element[i].Name j'en perdais la moitié !!!!

  12. #12
    Membre éclairé
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Par défaut
    Je ne comprends pas trop le lien entre "truc.Name" et la suppression d'un item...

  13. #13
    SLE
    SLE est déconnecté
    Membre émérite Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Par défaut
    Citation Envoyé par Harry_polin
    Je ne comprends pas trop le lien entre "truc.Name" et la suppression d'un item...
    Ben justement c'est bien ce qu'il dit !!! Même s'il fait un simple MessageBox.Show(c.Name) dans le foreach au lieu d'un Dispose(), le tableau de controls semble se tasser aussi, alors qu'il n'y a pas de suppression...

    Je vais tester pour voir si j'ai le même phénomène... Bizarre quand même !

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

Discussions similaires

  1. Creation de pictureBox automatique dans un groupBox
    Par andy331 dans le forum VB.NET
    Réponses: 6
    Dernier message: 10/06/2010, 13h53
  2. [C#] Capture écran dans pictureBox
    Par Gauden dans le forum Windows Forms
    Réponses: 5
    Dernier message: 05/05/2004, 10h18
  3. LABEL QUI DISPARAIT SUR UN PICTUREBOX !
    Par Sophie42 dans le forum MFC
    Réponses: 2
    Dernier message: 13/01/2004, 12h10
  4. [VB6] [Graphisme] Inversion dans picturebox
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 16/04/2003, 15h05
  5. [VB6] [Graphisme] Arc de cercle dans un picturebox
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 04/11/2002, 17h55

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