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

VB.NET Discussion :

Boucler (For/For Each) sur toutes les TextBox (Control) d'un Formulaire (Form)


Sujet :

VB.NET

  1. #1
    Invité
    Invité(e)
    Par défaut Boucler (For/For Each) sur toutes les TextBox (Control) d'un Formulaire (Form)
    Bonjour à tous,

    Je suis tout nouveau au niveau de la programmation en Visual Basic (VB 11.0 & .NET 4.5).
    Je suis en cours d'apprentissage, et juste avant, il y a quelques temps, je programmais un peu en VBA.

    Ici, en VB, j'aurai aimé connaitre la syntaxe la plus simple pour pouvoir boucler sur toutes les textBox d'un formulaire (Form).

    Pour l'instant, voici mon code:
    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
     
        Private Sub Button2_Click(sender As Object, e As System.EventArgs) Handles Button2.Click
            For Each element As Forms.Control In Me.Controls
                If TypeOf element Is Forms.GroupBox Then
                    For Each elementChild1 As Forms.Control In element.Controls
                        If TypeOf elementChild1 Is Forms.GroupBox Then
                            For Each elementChild2 As Forms.Control In elementChild1.Controls
                                If TypeOf elementChild2 Is Forms.TextBox Then
                                    DirectCast(elementChild2, Forms.TextBox).Text = Nothing
                                End If
                            Next
                        End If
                    Next
                End If
            Next
        End Sub
    Comme vous le voyez, il est relativement complexe pour si peu, mais c'est pour l'instant la solution que j'ai retenu.
    Ici, les TextBox sont contenu dans des GroupBox, mais imaginez que je ne sache pas vraiment où soient les TextBox et qu'il y en ai dispatché un peu partout dans le formulaire et dans n'importe quel type de conteneurs...

    En bref, y a t-il une manière plus simple et plus générale pour directement accéder à la totalité des TextBox d'un Form ? Si oui, laquelle justement.

    Merci d'avance, A+


    P.S.:
    Options:
    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
     
      </PropertyGroup>
      <PropertyGroup>
        <OptionExplicit>On</OptionExplicit>
      </PropertyGroup>
      <PropertyGroup>
        <OptionCompare>Binary</OptionCompare>
      </PropertyGroup>
      <PropertyGroup>
        <OptionStrict>On</OptionStrict>
      </PropertyGroup>
      <PropertyGroup>
        <OptionInfer>Off</OptionInfer>
      </PropertyGroup>
      <PropertyGroup>
    Espaces de nom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      <ItemGroup>
        <Import Include="Console = System.Console" />
        <Import Include="Forms = System.Windows.Forms" />
        <Import Include="Tasks = System.Threading.Tasks" />
        <Import Include="Thread = System.Threading.Thread" />
        <Import Include="Timer = System.Diagnostics.Stopwatch" />
        <Import Include="Vb = Microsoft.VisualBasic" />
      </ItemGroup>
    Images (pour voir les GroupBox) :
    Nom : Form1.png
Affichages : 2191
Taille : 12,9 Ko



    --------------------------------------------------------------------------------

    Tant qu'on y ai, j'ai justement une autre question, ça tombe bien

    Dans le même projet test (donc même Option et Imports), j'ai traduit le code suivant en VB : http://blogs.msdn.com/b/shawnhar/arc...c-dynamic.aspx
    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
     
    Namespace SampleHeritage
        Class Animal
     
        End Class
        Class Cat : Inherits Animal
     
        End Class
        Class Dog : Inherits Animal
     
        End Class
        Class Mouse : Inherits Animal
     
        End Class
     
     
        Module M1
            'We can create several overloads of the same method, specialized according to different combinations of their parameter types:
            Sub ReactSpecialization([me] As Animal, other As Animal)
                Console.WriteLine("{0} is not interested in {1}.", [me], other)
            End Sub
            Sub ReactSpecialization([me] As Cat, other As Dog)
                Console.WriteLine("Cat runs away from dog.")
            End Sub
            Sub ReactSpecialization([me] As Cat, other As Mouse)
                Console.WriteLine("Cat chases mouse.")
            End Sub
            Sub ReactSpecialization([me] As Dog, other As Cat)
                Console.WriteLine("Dog chases cat.")
            End Sub
     
            'And now the magic part:
            Sub React([me] As Animal, other As Animal)
                ReactSpecialization([me], other)
            End Sub
     
            'This works because of the "as dynamic" cast, which tells the C# compiler, 
            'rather than just calling ReactSpecialization(Animal, Animal), 
            'to dynamically examine the type of each parameter and make a runtime choice 
            'about which method overload to invoke.
     
            'To prove it really works:
            Sub Test()
                Dim cat As Animal = New Cat()
                Dim dog As Animal = New Dog()
                Dim mouse As Animal = New Mouse()
     
                React(cat, dog)
                React(cat, mouse)
                React(dog, cat)
                React(dog, mouse)
            End Sub
     
            'Output:
     
            '    Cat runs away from dog.
            '    Cat chases mouse.
            '    Dog chases cat.
            '    Dog is not interested in Mouse.
        End Module
    End Namespace
    En langage C# et en utilisant un type Dynamic (as dynamic), la sortie du Debug.Print est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            'Output:
     
            '    Cat runs away from dog.
            '    Cat chases mouse.
            '    Dog chases cat.
            '    Dog is not interested in Mouse.
    Si on essaye ce code en VB, la sortie sera:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    '    Cat is not interested in Dog.
    '    Cat is not interested in Mouse.
    '    Dog is not interested in Cat.
    '    Dog is not interested in Mouse.
    parce que j'ai remplacé le Type dynamic (C#) en type Animal.

    D'après vous, comment obtenir le même résultat qu'en C#.
    On voit qu'en exécutant le code, le "Sous-type" est bien respectivement Cat, Dog et Mouse lors de l'initialisation dans la procédure Sub Test().
    Dernière modification par Invité ; 25/06/2014 à 19h36.

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,

    Citation Envoyé par Nouveau2 Voir le message
    Ici, en VB, j'aurai aimé connaitre la syntaxe la plus simple pour pouvoir boucler sur toutes les textBox d'un formulaire (Form).
    Il faut utiliser une méthode récursive.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Sub EffaceTextBox(ByVal conteneur As Control)
            For Each ctrl As Control In conteneur.Controls
                Select Case True
                    Case TypeOf ctrl Is TextBox
                        ctrl.Text = ""
                    Case TypeOf ctrl Is Panel, TypeOf ctrl Is GroupBox
                        EffaceTextBox(ctrl)
                    Case TypeOf ctrl Is TabControl          ' cas particulier des TabControls qui contiennent une collection de page conteneur
                        For Each tp As TabPage In DirectCast(ctrl, TabControl).TabPages
                            EffaceTextBox(tp)
                        Next
                End Select
            Next
        End Sub
    Les sujets étant différents ouvre une autre discussion pour la 2ème partie.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  3. #3
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Y'a pas spécialement besoin de tester tant de types de contrôles différents (notamment les TabControl) et moyen de simplifier ('fin ça c'est question de goûts) un peu le code
    Au passage j'en ai profiter pour en faire une méthode générique comme ça c'est réutilisable on sait jamais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    'On pourrait en faire une méthode d'extension sur Control au besoin
    Function GetAllControls (Of TControl As Control) (source As Control) As IEnumerable (Of TControl)
        Dim children = source.Controls.Cast (Of Control) ()
        Return children.
            SelectMany (Function(child) GetAllControls (Of TControl) (child)).
            OfType (Of TControl).Concat (children.OfType (Of TControl))
    End Function
     
    'Exemple d'utilisation dans un Form
    Public Sub ClearTextBoxes ()
        Dim textboxes = GetAllControls (Of TextBox) (Me) ' Me représente le Form actuel
        Array.ForEach (textboxes.ToArray, Sub (tb) tb.Text = "")
    End Sub
    Cordialement !

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Merci Sehnsucht pour cette méthode.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut,

    Merci à tous les 2.

    Pour l'instant, je n'ai pas encore essayé. Je vais surement essayer demain ou après demain et je vous direz ce qu'il en est. Merci encore

Discussions similaires

  1. [XL-2010] [VBA] Action sur toutes les textbox d'un userform
    Par MarcL08 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/11/2017, 07h20
  2. [XL-2003] Boucle For sur toutes les feuilles d'un classeur
    Par dlight dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/10/2010, 22h48
  3. Boucler sur toutes les paires d'un set
    Par tnarol dans le forum SL & STL
    Réponses: 12
    Dernier message: 30/04/2008, 20h41
  4. replace() qui s'applique sur toutes les occurences
    Par Oluha dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/03/2005, 11h27
  5. Réponses: 9
    Dernier message: 07/05/2003, 12h57

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