Question

Je sais que WebForms a un contrôle RadioButtonList , mais je ne parviens pas à en trouver un pour WinForms . Ce dont j'ai besoin, c’est de regrouper 3 boutons radio pour qu’un seul puisse être sélectionné à la fois. Je constate que je dois le faire avec du code, ce qui est pénible. Est-ce que je ne vois tout simplement pas RadioButtonList quelque part, ou n'existe-t-il pas réellement dans WinForms ?

Était-ce utile?

La solution

Apparemment pas .

Vous pouvez regrouper trois boutons radio en utilisant une GroupBox ou un panneau comme cela est fait ici .

Autres conseils

Si vous voulez juste grouper des boutons radio, il suffit de les mettre dans un conteneur, ils agiront alors comme un groupe, mais si vous avez besoin d'une liaison de données comme celle d'un ComboBox ou ListBox ou CheckedListBox fonctionne; vous avez besoin d'un contrôle RadioButtonList .

Les formulaires Windows ne possèdent pas de contrôle RadioButtonList intégré. Vous pouvez créer votre propre contrôle en dérivant le formulaire ListBox et en le faisant dessiner par son propriétaire et dessiner vous-même des boutons radio. C’est ainsi que CheckedListBox est également créé.

Ainsi, le contrôle prend en charge la liaison de données et bénéficiera de toutes les fonctionnalités de ListBox , y compris DataSource , SelectedValue , DisplayMember , ValueMember et ainsi de suite. Par exemple, vous pouvez simplement l'utiliser de cette façon:

this.radioButtonList1.DataSource = peopleTable; 
this.radioButtonList1.DisplayMember = "Name"; 
this.radioButtonList1.ValueMember= "Id";

Ou par exemple pour un enum , simplement de cette façon:

this.radioButtonList1.DataSource = Enum.GetValues(typeof(DayOfWeek)); 

Dans l'image ci-dessous, le deuxième RadioButtonList est désactivé en définissant Enabled = false; :

 entrer la description de l'image ici entrer la description de l'image ici

Le contrôle prend également en charge de droite à gauche:

 entrez la description de l'image ici

Il prend également en charge les colonnes multiples:

 entrez la description de l'image ici

RadioButtonList

Voici le code source pour le contrôle. Vous pouvez l'utiliser comme un ListBox normal en ajoutant des éléments ou en définissant une source de données avec / sans liaison de données:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
public class RadioButtonList : ListBox
{
    Size s;
    public RadioButtonList()
    {
        this.DrawMode = DrawMode.OwnerDrawFixed;
        using (var g = Graphics.FromHwnd(IntPtr.Zero))
            s = RadioButtonRenderer.GetGlyphSize(
                Graphics.FromHwnd(IntPtr.Zero), RadioButtonState.CheckedNormal);
    }
    protected override void OnDrawItem(DrawItemEventArgs e)
    {

        var text = (Items.Count > 0) ? GetItemText(Items[e.Index]) : Name;
        Rectangle r = e.Bounds; Point p;
        var flags = TextFormatFlags.Default | TextFormatFlags.NoPrefix;
        var selected = (e.State & DrawItemState.Selected) == DrawItemState.Selected;
        var state = selected ?
            (Enabled ? RadioButtonState.CheckedNormal : 
                       RadioButtonState.CheckedDisabled) :
            (Enabled ? RadioButtonState.UncheckedNormal : 
                       RadioButtonState.UncheckedDisabled);
        if (RightToLeft == System.Windows.Forms.RightToLeft.Yes)
        {
            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 |= TextFormatFlags.RightToLeft | 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);
        }
        var bc = selected ? (Enabled ? SystemColors.Highlight : 
            SystemColors.InactiveBorder) : BackColor;
        var fc = selected ? (Enabled ? SystemColors.HighlightText : 
            SystemColors.GrayText) : ForeColor;
        using (var b = new SolidBrush(bc))
            e.Graphics.FillRectangle(b, e.Bounds);
        RadioButtonRenderer.DrawRadioButton(e.Graphics, p, state);
        TextRenderer.DrawText(e.Graphics, text, Font, r, fc, bc, flags);
        e.DrawFocusRectangle();
        base.OnDrawItem(e);
    }
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public override SelectionMode SelectionMode
    {
        get { return System.Windows.Forms.SelectionMode.One; }
        set { }
    }
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public override int ItemHeight
    {
        get { return (this.Font.Height + 2); }
        set { }
    }
    [EditorBrowsable(EditorBrowsableState.Never), Browsable(false),
    DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public override DrawMode DrawMode
    {
        get { return base.DrawMode; }
        set { base.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; }
    }
}

Le simple fait que plusieurs boutons radio se trouvent dans le même conteneur les rend mutuellement exclusifs, vous n’avez pas à coder ce comportement vous-même. Il suffit de les mettre dans un panneau ou une boîte de groupe comme suggéré par Matthew

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top