IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Selectionner un seul item dans une CheckedListBox


Sujet :

VB.NET

  1. #1
    Membre confirmé
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Par défaut Selectionner un seul item dans une CheckedListBox
    Ce n'est pas logique, mais c'est peut-être moi !!!

    Bonsoir,

    J'ai planché pas mal de temps sur ce petit problème de "coche"-"décoche" dans une CheckesListBox.

    Mon souhait est de ne pouvoir sélectionner qu'un item à la fois dans la liste.
    Le code ci-joint fonctionne parfaitement si je passe d'un Item à un autre.
    Mais si je sélectionne par exemple Item B, puis le déselectionne, puis le resélectionne.
    La "coche" ne se met pas..... ou alors après quelques essais d'une manière non constante d'ailleurs.
    Parfois en insistant après 3 clics, parfois après 5 clics, rarement directement.

    En cherchant sur le net, j'ai trouvé des exemples mais qui ressemeblent presque 100% à mon code !!

    Quelqu'un voit il la faille ?

    Merci

    Pierre

    Nom : checkedlistbox.jpg
Affichages : 455
Taille : 23,9 Ko
    Nom : checkedlistbox2.jpg
Affichages : 437
Taille : 19,8 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            CheckedListBox1.Items.Clear()
     
            CheckedListBox1.Items.Add("ITEM A")
            CheckedListBox1.Items.Add("ITEM B")
            CheckedListBox1.Items.Add("ITEM C")
        End Sub
     
     
        Private Sub CheckedListBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles CheckedListBox1.MouseClick
     
            Dim idx, sidx As Integer
     
            sidx = CheckedListBox1.SelectedIndex
     
            For idx = 0 To CheckedListBox1.Items.Count - 1 Step 1
                If idx <> sidx Then
                    CheckedListBox1.SetItemChecked(idx, False)
                Else
                    CheckedListBox1.SetItemChecked(sidx, True)
                End If
            Next idx
     
        End Sub
    End Class

  2. #2
    Membre chevronné Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 346
    Par défaut
    Bonjour,

    il faut le faire sur la méthode ItemCheck

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) {
          for (int ix = 0; ix < checkedListBox1.Items.Count; ++ix)
            if (ix != e.Index) checkedListBox1.SetItemChecked(ix, false);
        }

  3. #3
    Membre confirmé
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Par défaut
    Merci, mais je suis incapable d'adapter ce code ( C++ ? ) sur mon petit VBNet.
    Autodidacte en VBNet, j'ai, je le sais, de grosses lacunes.

    Pierre

  4. #4
    Membre chevronné Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 346
    Par défaut
    c'est du C# que vous pouvez convertir ici en VB: https://converter.telerik.com/

  5. #5
    Membre confirmé
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Par défaut
    Pas mal.merci.
    J'ai converti et reçu ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub checkedListBox1_ItemCheck(ByVal sender As Object, ByVal e As ItemCheckEventArgs)
        For ix As Integer = 0 To checkedListBox1.Items.Count - 1
            If ix <> e.Index Then checkedListBox1.SetItemChecked(ix, False)
        Next
    End Sub
    Maintenant j'ignore comment atteindre ce code !! Un Call? automatique quand ... ?

    Pierre

  6. #6
    Membre confirmé
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Par défaut
    Voilà j'ai modifié ainsi et cela fonctionne avec properties "CheckOnClick à True sur la CheckedListBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Private Sub checkedListBox1_ItemCheck(ByVal sender As Object, ByVal e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
            For ix As Integer = 0 To CheckedListBox1.Items.Count - 1
                If ix <> e.Index Then CheckedListBox1.SetItemChecked(ix, False)
            Next
    End Sub
    La piste de "Mouse_Click" n'était vraiment pas la bonne, mais si je ne comprends toujours pas la réaction à mon premier code !!!!

    Merci

    Bonne journée

    Pierre

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Citation Envoyé par PeD012 Voir le message
    J'ai planché pas mal de temps sur ce petit problème de "coche"-"décoche" dans une CheckesListBox.

    Mon souhait est de ne pouvoir sélectionner qu'un item à la fois dans la liste.
    Il suffit d'utiliser le composant qui gère nativement ce comportement : le radiobuttonlist

  8. #8
    Membre confirmé
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Par défaut
    Citation Envoyé par popo Voir le message
    Il suffit d'utiliser le composant qui gère nativement ce comportement : le radiobuttonlist
    Aie !! je suis embêté et confus. Je ne trouve même pas le composant RadioButtonList dans la boîte à outils de mon "Microsoft Visual Studio 2017" !!

  9. #9
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Effectivement, je viens de voir que la RadioButtonList n'est pas disponible en Winform.
    Mais il est possible d'en créer une de toutes pièces sans trop d'efforts

    https://www.c-sharpcorner.com/articl...ation-c-sharp/

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    C'est cadeau :
    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Imports System.ComponentModel
    Imports System.Windows.Forms.VisualStyles
     
    Partial Public Class RadioButtonList
     
        Private s As Size
     
        Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)
            Dim text = If((Items.Count > 0), GetItemText(Items(e.Index)), Name)
            Dim r As Rectangle = e.Bounds
            Dim p As Point
            Dim flags = TextFormatFlags.[Default] Or TextFormatFlags.NoPrefix
            Dim selected = (e.State And DrawItemState.Selected) = DrawItemState.Selected
            Dim state = If(selected, (If(Enabled, RadioButtonState.CheckedNormal, RadioButtonState.CheckedDisabled)), (If(Enabled, RadioButtonState.UncheckedNormal, RadioButtonState.UncheckedDisabled)))
     
            If RightToLeft = System.Windows.Forms.RightToLeft.Yes Then
                p = New Point(r.Right - r.Height + (ItemHeight - s.Width) / 2, r.Top + (ItemHeight - s.Height) / 2)
                r = New Rectangle(r.Left, r.Top, r.Width - r.Height, r.Height)
                flags = flags Or TextFormatFlags.RightToLeft Or TextFormatFlags.Right
            Else
                p = New Point(r.Left + (ItemHeight - s.Width) / 2, r.Top + (ItemHeight - s.Height) / 2)
                r = New Rectangle(r.Left + r.Height, r.Top, r.Width - r.Height, r.Height)
            End If
     
            Dim bc = If(selected, (If(Enabled, SystemColors.Highlight, SystemColors.InactiveBorder)), BackColor)
            Dim fc = If(selected, (If(Enabled, SystemColors.HighlightText, SystemColors.GrayText)), ForeColor)
     
            Using b = New SolidBrush(bc)
                e.Graphics.FillRectangle(b, e.Bounds)
            End Using
     
            RadioButtonRenderer.DrawRadioButton(e.Graphics, p, state)
            TextRenderer.DrawText(e.Graphics, text, Font, r, fc, bc, flags)
            e.DrawFocusRectangle()
            MyBase.OnDrawItem(e)
        End Sub
     
        <Browsable(False), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
        Public Overrides Property SelectionMode As SelectionMode
            Get
                Return System.Windows.Forms.SelectionMode.One
            End Get
            Set(ByVal value As SelectionMode)
            End Set
        End Property
     
        <Browsable(False), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
        Public Overrides Property ItemHeight As Integer
            Get
                Return (Me.Font.Height + 2)
            End Get
            Set(ByVal value As Integer)
            End Set
        End Property
     
        <EditorBrowsable(EditorBrowsableState.Never), Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)>
        Public Overrides Property DrawMode As DrawMode
            Get
                Return MyBase.DrawMode
            End Get
            Set(ByVal value As DrawMode)
                MyBase.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed
            End Set
        End Property
    End Class

    Dans le New (sans paramètre) du fichier Designer.vb du composant (juste avant l'appel à InitializeComponent):
    Code VB.Net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Me.DrawMode = DrawMode.OwnerDrawFixed
     
            Using g = Graphics.FromHwnd(IntPtr.Zero)
                s = RadioButtonRenderer.GetGlyphSize(Graphics.FromHwnd(IntPtr.Zero), RadioButtonState.CheckedNormal)
            End Using

  11. #11
    Membre confirmé
    Homme Profil pro
    Tooling - Testing
    Inscrit en
    Décembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : Belgique

    Informations professionnelles :
    Activité : Tooling - Testing

    Informations forums :
    Inscription : Décembre 2008
    Messages : 141
    Par défaut
    Merci du cadeau je prends.

    Bonne soirée

    Pierre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Autoriser la coche que d'un seul item dans une checklistbox
    Par souhail72 dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 23/09/2016, 16h29
  2. Réponses: 1
    Dernier message: 14/09/2010, 15h02
  3. suppression d'items dans une CheckedListBox
    Par inforlab dans le forum Windows Forms
    Réponses: 3
    Dernier message: 01/12/2008, 11h57
  4. Réponses: 3
    Dernier message: 05/07/2006, 17h29
  5. Selectionner automatiquement un item dans une liste
    Par nebule dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/12/2004, 17h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo