Simplification code [Résolu]

Signaler
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020
-
Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
-
Bonjour à tous,

J'ai ce code :

RB_0_0.Checked = True
RB_0_1.Checked = True
RB_0_2.Checked = True
RB_0_3.Checked = True
RB_0_4.Checked = True
RB_0_5.Checked = True
RB_0_6.Checked = True
RB_0_7.Checked = True
RB_0_8.Checked = True
RB_0_9.Checked = True
RB_0_10.Checked = True
RB_0_11.Checked = True
RB_0_12.Checked = True
RB_0_13.Checked = True
RB_0_14.Checked = True


Je cherche à le simplifier, je pense donc passer sur une boucle for.
Ce qui me donne ceci :

Dim RB_Entete = "RB_0_"
Dim RB_Nom = ""
Dim RB_final As New RadioButton

For i = 0 To 14
RB_Nom = RB_Entete & i
RB_final.Name = RB_Nom
RB_final.Checked = True
Next


Seulement, aucun changement ..

Si vous auriez une idée :)

Merci beaucoup de votre aide.

11 réponses

Messages postés
6923
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 septembre 2020
112
Bonjour,

voir ceci pour faire une boucle sur les control:

http://pise.info/vb-net/06.htm
Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
Bonjour

Pas ton erreur, mais tes erreurs.
  • tu écris du vb sans option strict. Du coup, tu déclares des variables sans leur donner de type. Et puis tu penses que ça seras du type que tu espères.
                Rb_final = Rb_entete & i  ’Rb_final est initialisé à partir du résultat de la concaténation d’une string et d’un entier, comme ça ne peut pas faire un entier, c’est une string
    
                For Each Controle In TabPage1.Controls
                    If TypeOf Rb_final Is RadioButton Then ’ce if ne sera jamais vrai puisque Rb_final est une string
  • c’est la variable Controle dont il faudrait tester le type
  • une fois un radio bouton trouvé, il faudrait tester si le nom concorde.
  • en imbriquant ainsi deux boucles, tu itères tous les contrôles pour trouver RB_0_1 et tu recommences avec RB_0_2 etc. Si tu vérifies que le nom commence par RB_0_, tu ne fais qu’une seule fois la boucle. Là tu n’as que quelques objets à itérer, mais le jour où c’est quelques dizaines de milliers, ça va être très très long.
  • enfin, si je m’en réfère à ta précédente question, ce ne sont plus des radiobutton mais des AdvancedRadioButton



En te servant de Linq, tu peux obtenir une collection de AdvancedRadioButton dont le nom commence par RB_0_.

Je te réponds avec ma tablette, et la syntaxe Linq en vb.net ne m’est pas super familière, mais comme tu as déjà su te débrouiller avec du c# je te l’écrit dans ce langage.
La méthode OffType permet de filtrer une collection sur un type.
La méthode Where permet de filtrer sur une condition personnalisée, ici que le nom commence par RB_0_

foreach(AdvancedRadioButton buton in TabPage1.Controls.OffType<AdvancedRadioButton>().Where(c => c.Name.StartsWith("RB_0_"))
{
    buton.Checked = true;
}





Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Merci beaucoup, je vais "traduire" en VB.net :)
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Bonjour
En supposant que tous tes RadioButtons sont à l'intérieur de TabPage1
 Dim Index as Integer = 0
 For Each Ctl as Control in TabPage1.Controls
         ' pour chaque Ctl vérifier que c'est un RadionButton avec le bon Index
         If TypeOf(Ctl ) Is RadioButton And Ctl.Name = "RB_0_" & Index.Tostring Then
                  Ctl.Checked = True
                   Index = Index + 1
         End If
 Next Controle
 

Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
Salut VB, je t'ai grillé ;)
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Merci beaucoup pour la réponse.
Effectivement, c'est le cas, ils sont bien dans TabPage1.
Je vais essayer !
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Salut Whis
ton code est bien plus concis
en c#
foreach(AdvancedRadioButton button in TabPage1.Controls.OffType<AdvancedRadioButton>().Where(c => c.Name.StartsWith("RB_0_"))
{
    button.Checked = true;
}


et en VB Net
For Each button As AdvancedRadioButton In TabPage1.Controls.OffType(Of AdvancedRadioButton).Where(Function(c) c.Name.StartsWith("RB_0_"))
    button.Checked = True
Next


Par contre je pense que dans une collection de RadioButton un seul peut être "checké" et je ne vois pas l'intérêt de les cocher tous : dans ce cas à quoi servent-ils ?

Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Désolé, je n'avais pas rafraichi la page !

L'idée est d'avoir une liste d'options à choisir, savoir ce qu'on va faire d'un dossier, pour être plus clair.

Sur une ligne, j'ai un Label, avec 3 AdvancedRadioButtons (Merci Whis) qui permettent de choisir soit de déplacer, supprimer, ou ne rien faire.
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Bonjour
Regarde mon précédent message : j'ai fait la traduction en VB Net
Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
Vi, c'est le Function(c) que je ne sais jamais où/ comment mettre de tête.
Messages postés
2235
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
15 septembre 2020
113
Si tout est Ok penses à mettre le sujet en résolu .
Merci

Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
De rien
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

J'ai essayé cela :

        Dim Controle As Control

        Dim Rb_entete = "RB_0_"
        Dim Rb_final

        For i = 0 To 14
            Rb_final = Rb_entete & i

            For Each Controle In TabPage1.Controls
                If TypeOf Rb_final Is RadioButton Then
                    Rb_final.Checked = True
                End If
            Next Controle
        Next


En vain, d'où vient mon erreur ?
Je creuse ...
Messages postés
6923
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 septembre 2020
112
Essaie ceci:

  Dim Truc As Control
        Dim Toto As RadioButton
        Dim i As Integer
        For Each Truc In TabPage1.Controls
            If TypeOf Truc Is RadioButton Then
                i = i + 1
                Toto = CType(Truc, RadioButton)
                Toto.Text = "RB_0_" & i
                Toto.Checked = True
            End If
        Next Truc


tu n'auras qu'un RadioButton de coché!
si tu veux cocher plusieurs control il faut utiliser des CheckBox

Voilà

@+ Le Pivert
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020
>
Messages postés
6923
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 septembre 2020

Merci beaucoup, je vais essayer.
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

J'ai donc essayé plusieurs méthodes, celle qui me paraît la plus adaptée est celle de Whismeril.

J'ai "traduit" son code par ceci :

Dim Controle
        Dim Filtre = "RB_0_"
For Each RB As AdvancedRadioButton In TabPage1.Controls.OfType(Of AdvancedRadioButton).Where(Controle >= Controle.name.startswith(Filtre)))
                        RB.Checked = True
        Next


Ceci dit, j'ai deux erreurs persistantes.

La première, au niveau du "Where", au moment de la filtration.



La dernière est en fin de ligne du For each, "Fin d'instruction attendue".

Je creuse ;)
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Oui, je venais de trouver la solution, au moment où tu as posté ce message !

Tout est fonctionnel, je vais créer ma classe maintenant, merci beaucoup à tous.
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Pour ceux que cela intéresse, je pose la classe qui va faire le boulot.

'UTILISATION:
' -Tous les AdvancedRadioButtons:    Bouton_Radio.Tous_A_RB(Controle, Filtre)
' -Tous les RadioButtons:    Bouton_Radio.Tous_RB(Controle, Filtre)

Public Class Bouton_Radio

    Public Shared Function Tous_A_RB(ByVal Controle As Control, ByVal Filtre As String)

        Try
            For Each RB As AdvancedRadioButton In Controle.Controls.OfType(Of AdvancedRadioButton).Where(Function(c) c.Name.StartsWith(Filtre))
                RB.Checked = True
            Next

        Catch ex As Exception
            MsgBox("Erreur lors du traitement." & Chr(10) & Chr(13) & ex.Message)
        End Try

    End Function

    Public Shared Function Tous_RB(ByVal Controle As Control, ByVal Filtre As String)

        Try
            For Each RB As RadioButton In Controle.Controls.OfType(Of RadioButton).Where(Function(c) c.Name.StartsWith(Filtre))
                RB.Checked = True
            Next

        Catch ex As Exception
            MsgBox("Erreur lors du traitement." & Chr(10) & Chr(13) & ex.Message)
        End Try

    End Function

End Class