Simplification code

Résolu
JUANABIBI
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020
- 7 avril 2020 à 11:51
Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
- 7 avril 2020 à 19:45
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

cs_Le Pivert
Messages postés
7751
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 mai 2022
129
7 avril 2020 à 11:58
Bonjour,

voir ceci pour faire une boucle sur les control:

http://pise.info/vb-net/06.htm
1
Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
596
Modifié le 7 avril 2020 à 17:58
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
1
JUANABIBI
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

7 avril 2020 à 18:27
Merci beaucoup, je vais "traduire" en VB.net :)
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
7 avril 2020 à 18:01
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
 

1
Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
596
7 avril 2020 à 18:20
Salut VB, je t'ai grillé ;)
0
JUANABIBI
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

7 avril 2020 à 18:30
Merci beaucoup pour la réponse.
Effectivement, c'est le cas, ils sont bien dans TabPage1.
Je vais essayer !
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
Modifié le 7 avril 2020 à 18:36
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 ?

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

7 avril 2020 à 18:52
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
7 avril 2020 à 18:50
Bonjour
Regarde mon précédent message : j'ai fait la traduction en VB Net
1
Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
596
7 avril 2020 à 19:02
Vi, c'est le Function(c) que je ne sais jamais où/ comment mettre de tête.
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
Modifié le 7 avril 2020 à 19:06
Si tout est Ok penses à mettre le sujet en résolu .
Merci

1
Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
596
7 avril 2020 à 19:45
De rien
1
JUANABIBI
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

7 avril 2020 à 15:24
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 ...
0
cs_Le Pivert
Messages postés
7751
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 mai 2022
129
7 avril 2020 à 17:51
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
0
JUANABIBI
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020
> cs_Le Pivert
Messages postés
7751
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
24 mai 2022

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

7 avril 2020 à 18:46
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 ;)
0
JUANABIBI
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

7 avril 2020 à 19:02
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.
0
JUANABIBI
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Modifié le 7 avril 2020 à 19:08
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
0