Winforms RadiobuttonList não existe?
-
06-07-2019 - |
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
?
Soluçã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;
:
Além disso, o controle também suporta a direita para a esquerda:
Ele também suporta várias colunas:
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