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 :

Probleme boucle For Each controls


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Par défaut Probleme boucle For Each controls
    Bonjour bonjour,

    J'ai une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Sub DisposeAll(ByVal MyForm As Form)
            Dim C As Control
            For Each C In MyForm.Controls
                MsgBox(C.ToString)
                C.Dispose()
                C = Nothing
            Next
        End Sub
    Mais je ne comprend pas pourquoi cette fonction ne prend pas en compte les élements qui n'ont plus le meme état que lorsque qu'ils ont été créés...
    Plus précisement, je crée quelques élements dynamiquement, et les élements qui, par exemple comme un bouton qui serait enabled (ne l'étant pas lors de sa création), n'ont pas le même état, ne sont pas pris en compte dans la boucle...

    Merci d'avance pour une petite aide qui serait la bienvenue ^^

  2. #2
    Membre Expert
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Par défaut
    Excuse mais je n'ai pas bien saisie ton soucis...
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Par défaut
    Un peu plus de code t'éclairera surement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Friend Shared WithEvents S_ADV As TextBox
    Friend Shared WithEvents S_CHK As CheckBox
    Friend Shared WithEvents S_NEXT As Button
    Friend Shared WithEvents S_IMG As PictureBox

    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
    Public Shared Sub InitializeComponent()
            With InstallForm
     
                S_ADV = New TextBox
                S_CHK = New CheckBox
                S_NEXT = New Button
                S_IMG = New PictureBox
     
                components = New System.ComponentModel.Container
                CType(S_IMG, System.ComponentModel.ISupportInitialize).BeginInit()
                .SuspendLayout()
                '
                'S_ADV
                '
                S_ADV.Location = New System.Drawing.Point(12, 63)
                S_ADV.Multiline = True
                S_ADV.Name = "S_ADV"
                S_ADV.ReadOnly = True
                S_ADV.ScrollBars = System.Windows.Forms.ScrollBars.Vertical
                S_ADV.Size = New System.Drawing.Size(560, 233)
                S_ADV.TabIndex = 0
                S_ADV.Text = "blablabla"
                '
                'S_CHK
                '
                S_CHK.AutoSize = True
                S_CHK.Location = New System.Drawing.Point(12, 302)
                S_CHK.Name = "S_CHK"
                S_CHK.Size = New System.Drawing.Size(15, 14)
                S_CHK.TabIndex = 1
                S_CHK.UseVisualStyleBackColor = True
                S_CHK.Text = "reblablabla"
                AddHandler S_CHK.CheckedChanged, AddressOf S_CHK_CheckedChanged
                '
                'S_NEXT
                '
                S_NEXT.Location = New System.Drawing.Point(472, 329)
                S_NEXT.Name = "S_NEXT"
                S_NEXT.Size = New System.Drawing.Size(100, 23)
                S_NEXT.TabIndex = 2
                S_NEXT.UseVisualStyleBackColor = True
                S_NEXT.Text = "Suiva&nt >"
                S_NEXT.Enabled = False
                AddHandler S_NEXT.Click, AddressOf S_NEXT_Click
                '
                'S_IMG
                '
                S_IMG.Location = New System.Drawing.Point(12, 7)
                S_IMG.Name = "S_IMG"
                S_IMG.Size = New System.Drawing.Size(560, 50)
                S_IMG.TabIndex = 5
                S_IMG.TabStop = False
                S_IMG.Image = My.Resources.ban1
                '
                'InstallForm
                '
                .Controls.Add(S_ADV)
                .Controls.Add(S_CHK)
                .Controls.Add(S_NEXT)
                .Controls.Add(S_IMG)
                S_CHK.Select()
                .Icon = My.Resources.icon
                .Text = "ICSI - Assistant d'installation"
                CType(S_IMG, System.ComponentModel.ISupportInitialize).EndInit()
                .ResumeLayout(False)
                .PerformLayout()
            End With
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Private Shared Sub S_CHK_CheckedChanged(ByVal sender As CheckBox, ByVal e As EventArgs)
            S_NEXT.Enabled = sender.Checked
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Private Shared Sub S_NEXT_Click(ByVal sender As Button, ByVal e As EventArgs)
            Try
                DisposeAll(InstallForm)
            Finally
                Msgbox("blabla")
            End Try
        End Sub
    La fonction DisposeAll est dans mon premier post.

    Bon voila mon probleme : La fonction DisposeAll recense tous les controles de la form InstallForm, il y en a 4 ici : S_ADV, S_CHK, S_NEXT et S_IMG. Or seuls les controles S_ADV et S_IMG sont recensés pas la boucle For Each.

    Je pense savoir d'où vient le probleme :

    • S_CHK est instancié Checked=False, or au moment ou j'appelle la fonction DisposeAll, il est Checked=True.
    • S_NEXT, lui, est instancié Enabled=False, or au moment ou j'appelle la fonction DisposeAll, il est Enabled=True.


    Les deux autres controles sont tels quels lors de l'appel de la fonction DisposeAll...

    Voilà, j'aimerais que ma fonction DisposeAll recense tous les elements de la form, pas seulement ceux qui n'ont pas changé...

    J'espere avoir été plus clair.

    Merci d'avance.

  4. #4
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 182
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 182
    Par défaut
    Bonjour.

    Je ne vois aucune espéce de raison qui explique ce comportement.

    Par contre, apparemment tu n'utilises pas le option strict on puisque tu passes une "installform" comme une form à la fonction.

    Est-ce que cela joue qu'il y ait conversion implicite de installform en form ?

    A tester peut être.

    Cdt.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Par défaut
    Salut,

    Merci pour ta réponse, mais cela ne change rien en dotnet 2.0 (d'ailleurs je programme en 3.5), enfin c'est ce que j'ai cru lire je ne sais plus où, et apres avoir testé j'en ai eu la confirmation.
    Je n'utilise pas Option Strict On, sinon les fonctions (private shared) que je rappelle avec AddHandler ne sont pas compatibles.

    Sinon je ne peux pas la déclarer as new InstallForm, pour la simple raison que la form est ouverte est j'effectue des modifications sur celle-ci : J'ajoute et je retire des controles, il me faut cette fonction avec for each pour supprimer tous les composants de la form, car suivant certaines conditions il se peut que je me retrouve avec plus ou moins de controles sur la form.

    Je cherche depuis 3 jours. Je ne comprend pas vraiment là.

    Edit : Le pire c'est que si je fais un MsgBox(MyForm.Controls.Count) dans ma fonction DisposeAll, il me dit 4, et il n'en dispose que 2.

    Edit 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            For i = 0 To MyForm.Controls.Count - 1
                MsgBox(MyForm.Controls.Item(i).ToString)
                MyForm.Controls.Item(i).Dispose()
            Next
    Ne fonctionne pas non plus. C'est d'ailleurs hallucinant qu'il me dise qu'il y en ait 4, et quand i arrive à 2, il me dit que c'est hors limite.

  6. #6
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 182
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 182
    Par défaut
    Bonjour.

    Bon j'ai essayé de recopier ton code pour voir ... mais y'a pas tout là ...

    Donc si tu peux mettre la totale (A la rigueur mets aussi la façon dont tu instancies cette form).

    Par contre je comprend pas pourquoi tes controls sont en shared et pourquoi ils sont dans le .designer (d'aprés le code que je vois) si c'est pour de la création en dynamique.

    Cdt.

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

Discussions similaires

  1. Probleme bouton afficher/masquer avec boucle for-each
    Par CouicCouic dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 25/11/2011, 08h48
  2. [XL-2007] Probleme boucle For each
    Par franc83 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/07/2011, 18h42
  3. [XL-2007] Probleme de boucle For Each
    Par Jessyline dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/05/2009, 17h21
  4. Probleme VBS et boucle For each + tableau
    Par fas3r dans le forum Windows
    Réponses: 0
    Dernier message: 26/02/2008, 03h00
  5. Boucle For each
    Par roots_man dans le forum ASP
    Réponses: 10
    Dernier message: 18/02/2005, 09h55

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