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
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_
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
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 ?
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
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
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".
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