Gestion Radiobuttons multiple [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 un Panel, qui regroupe plusieurs Radiobuttons.

Voici l'image :


L'utilisateur doit cliquer sur un des trois bouton pour chaque ligne.
Le problème est que si je crée des Groupbox, ça va être très laid, et je n'ai pas d'espace pour créer des panels.

J'ai essayé de regrouper les radiobuttons en Groupes.

      
 With CONFIG

            Groupe0.Add(.RB_0_0, .RB_1_0, .RB_2_0)
            Groupe1.Add(.RB_0_1, .RB_1_1, .RB_2_1)
            Groupe2.Add(.RB_0_2, .RB_1_2, .RB_2_2)
            Groupe3.Add(.RB_0_3, .RB_1_3, .RB_2_3)
            Groupe4.Add(.RB_0_4, .RB_1_4, .RB_2_4)
            Groupe5.Add(.RB_0_5, .RB_1_5, .RB_2_5)
            Groupe6.Add(.RB_0_6, .RB_1_6, .RB_2_6)
            Groupe7.Add(.RB_0_7, .RB_1_7, .RB_2_7)
            Groupe8.Add(.RB_0_8, .RB_1_8, .RB_2_8)
            Groupe9.Add(.RB_0_9, .RB_1_9, .RB_2_9)
            Groupe10.Add(.RB_0_10, .RB_1_10, .RB_2_10)
            Groupe11.Add(.RB_0_11, .RB_1_11, .RB_2_11)
            Groupe12.Add(.RB_0_12, .RB_1_12, .RB_2_12)
            Groupe13.Add(.RB_0_13, .RB_1_13, .RB_2_13)
            Groupe14.Add(.RB_0_14, .RB_1_14, .RB_2_14)

        End With



Deux choses donc :

---> Est-ce possible de faire des groupes de 3 pour chaque ligne ?

---> Est-ce possible de simplifier la déclaration des groupes ?

Pour cela, j'ai tenté :

        For i = 0 To 14

            test = "CONFIG.RB_0_" & i
            
        Next


Merci beaucoup pour votre aide précieuse.

4 réponses

Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
Bonsoir

en WPF, tu peux définir la propriété GroupName
https://www.wpftutorial.net/RadioButton.html

Et dans cette discussion https://stackoverflow.com/questions/2178240/how-do-i-group-windows-form-radio-buttons pr0gg3r (réponse du 26 avril 2013) a écrit une classe Winform qui fait pareil
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Merci beaucoup de la réponse !

Je ne travaille pas en WPF, malheureusement ...

J'ai essayé de convertir la classe que tu m'as fournie, elle est en C# et si je la passe en VB.net, j'ai plusieurs erreurs.

La voici :

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports System.Diagnostics
Imports System.Windows.Forms.VisualStyles
Imports System.Drawing
Imports System.ComponentModel

Namespace Use.your.own
    Public Class AdvancedRadioButton
        Inherits CheckBox

        Public Enum Level
            Parent
            Form
        End Enum

        <Category("AdvancedRadioButton"), Description("Gets or sets the level that specifies which RadioButton controls are affected."), DefaultValue(Level.Parent)>
        Public Property GroupNameLevel As Level
        <Category("AdvancedRadioButton"), Description("Gets or sets the name that specifies which RadioButton controls are mutually exclusive.")>
        Public Property GroupName As String

        Protected Overrides Sub OnCheckedChanged(ByVal e As EventArgs)
            MyBase.OnCheckedChanged(e)

            If Checked Then
                Dim arbControls = CType(Nothing, dynamic)

                Select Case GroupNameLevel
                    Case Level.Parent
                        If Me.Parent IsNot Nothing Then arbControls = GetAll(Me.Parent, GetType(AdvancedRadioButton))
                    Case Level.Form
                        Dim form As Form = Me.FindForm()
                        If form IsNot Nothing Then arbControls = GetAll(Me.FindForm(), GetType(AdvancedRadioButton))
                End Select

                If arbControls IsNot Nothing Then

                    For Each control As Control In arbControls
                        If control <> Me AndAlso (TryCast(control, AdvancedRadioButton)).GroupName = Me.GroupName Then (TryCast(control, AdvancedRadioButton)).Checked = False
                    Next
                End If
            End If
        End Sub

        Protected Overrides Sub OnClick(ByVal e As EventArgs)
            If Not Checked Then MyBase.OnClick(e)
        End Sub

        Protected Overrides Sub OnPaint(ByVal pevent As PaintEventArgs)
            CheckBoxRenderer.DrawParentBackground(pevent.Graphics, pevent.ClipRectangle, Me)
            Dim radioButtonState As RadioButtonState

            If Checked Then
                radioButtonState = RadioButtonState.CheckedNormal
                If Focused Then radioButtonState = RadioButtonState.CheckedHot
                If Not Enabled Then radioButtonState = RadioButtonState.CheckedDisabled
            Else
                radioButtonState = RadioButtonState.UncheckedNormal
                If Focused Then radioButtonState = RadioButtonState.UncheckedHot
                If Not Enabled Then radioButtonState = RadioButtonState.UncheckedDisabled
            End If

            Dim glyphSize As Size = RadioButtonRenderer.GetGlyphSize(pevent.Graphics, radioButtonState)
            Dim rect As Rectangle = pevent.ClipRectangle
            rect.Width -= glyphSize.Width
            rect.Location = New Point(rect.Left + glyphSize.Width, rect.Top)
            RadioButtonRenderer.DrawRadioButton(pevent.Graphics, New System.Drawing.Point(0, rect.Height / 2 - glyphSize.Height / 2), rect, Me.Text, Me.Font, Me.Focused, radioButtonState)
        End Sub

        Private Function GetAll(ByVal control As Control, ByVal type As Type) As IEnumerable(Of Control)
            Dim controls = control.Controls.Cast(Of Control)()
            Return controls.SelectMany(Function(ctrl) GetAll(ctrl, type)).Concat(controls).Where(Function(c) c.[GetType]() = type)
        End Function
    End Class
End Namespace


Première erreur :

 If Checked Then
                Dim arbControls = CType(Nothing, Dynamic)


Type attendu sur "Dynamic".

 If control <> Me AndAlso (TryCast(control, AdvancedRadioButton)).GroupName = Me.GroupName Then (TryCast(control, AdvancedRadioButton)).Checked = False


arbControls => L'expression est un type "Dynamic" qui n'est pas une collection.

control <> Me => L'opérateur '<>' n'est pas défini pour les types 'Control' et 'AdvancedRadioButton'.

Then (Trycast => Erreur de syntaxe au niveau de la parenthèse


Je fais des recherches de mon côté, merci beaucoup encore une fois pour votre aide.
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

control <> Me => L'opérateur '<>' n'est pas défini pour les types 'Control' et 'AdvancedRadioButton'.

Then (Trycast => Erreur de syntaxe au niveau de la parenthèse

Correction :
If control IsNot Me AndAlso Equals(TryCast(control, AdvancedRadioButton).GroupName, GroupName) Then TryCast(control, AdvancedRadioButton).Checked = False
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

La solution est la suivante, la conversion ne sert à rien dans notre cas sur la ligne suivante :

Dim arbControls = CType(Nothing, dynamic)


Il faut donc mettre, en lieu et place :

Dim arbControls = Nothing, Dynamic


Merci à tous :)
Messages postés
14768
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
20 septembre 2020
433
De rien, c'est toi qui a fait le principal du boulot, mois je me suis contenté de chercher un équivalent à GroupName en Winform.