Pergunta

eu sei que WebForms tem um RadioButtonList controle, mas não consigo encontrar um para WinForms. O que eu preciso é ter 3 radiobutões agrupados, para que apenas 1 possa ser selecionado por vez. Estou descobrindo que tenho que fazer isso através do código, o que é uma dor. Eu só não estou vendo RadioButtonList em algum lugar, ou realmente não existe em WinForms?

Foi útil?

Solução

Aparentemente não.

Você pode agrupar três radiobutões juntos usando uma caixa de grupo ou um painel Como é feito aqui.

Outras dicas

Se você deseja apenas agrupar botões de rádio, basta colocá-los em um contêiner, eles agirão como um grupo, mas se você precisar de ligação a dados como como um ComboBox ou ListBox ou CheckedListBox funciona, você precisa de um RadioButtonList ao controle.

Os formulários do Windows não têm um embutido RadioButtonList ao controle. Você pode criar seu próprio controle derivando o formulário ListBox E tornando-o o proprietário e desenhe botões de rádio você mesmo. É assim que CheckedListBox é criado também.

Dessa forma, o controle suporta a ligação de dados e se beneficiará de todos os recursos de ListBox, Incluindo DataSource, SelectedValue, DisplayMember, ValueMember e assim por diante. Por exemplo, você pode simplesmente usá -lo desta maneira:

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

Ou por exemplo para um enum, simplesmente desta forma:

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

Na imagem abaixo, o segundo RadioButtonList está desativado configurando Enabled = false;:

enter image description here enter image description here

Além disso, o controle também suporta a direita para a esquerda:

enter image description here

Ele também suporta várias colunas:

enter image description here

RadiobuttonList

Aqui está o código -fonte para controle. Você pode usá -lo como um normal ListBox Adicionando itens ou definindo a fonte de dados com/sem usar a ligação de dados:

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; }
    }
}

O simples fato de vários botões de rádio estarem no mesmo contêiner os torna mutuamente exclusivos, você não precisa codificar esse comportamento. Basta colocá -los em um painel ou caixa de grupo, conforme sugerido por Matthew

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top