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 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 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 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
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;
}





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 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
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 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
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 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
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 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
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 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
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 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 7 avril 2020 à 19:06
Si tout est Ok penses à mettre le sujet en résolu .
Merci

1
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
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 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
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 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024
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
Rejoignez-nous