WinForms RadioButtonList non esiste?
-
06-07-2019 - |
Domanda
So che WebForms
ha un controllo RadioButtonList
, ma non riesco a trovarne uno per WinForms
. Ciò di cui ho bisogno è di avere 3 RadioButton raggruppati insieme, in modo che solo 1 possa essere selezionato alla volta. Sto scoprendo che devo farlo attraverso il codice, il che è una seccatura. Non vedo RadioButtonList
da qualche parte o non esiste davvero in WinForms
?
Soluzione
Puoi raggruppare tre RadioButton usando un GroupBox o un Pannello come è fatto qui .
Altri suggerimenti
Se vuoi solo raggruppare i pulsanti di opzione, è sufficiente metterli in un contenitore, quindi si comporteranno come un gruppo, ma se hai bisogno di associazione di dati come un ComboBox
o ListBox
o CheckedListBox
funziona, è necessario un controllo RadioButtonList
.
Windows Form non ha un controllo RadioButtonList
integrato. Puoi creare il tuo controllo derivando dal modulo ListBox
e rendendolo tu stesso proprietario e disegnando i pulsanti di opzione. Questo è il modo in cui viene creato anche CheckedListBox
.
In questo modo, il controllo supporta l'associazione dei dati e beneficerà di tutte le funzionalità di ListBox
, inclusi DataSource
, SelectedValue
, DisplayMember
, ValueMember
e così via. Ad esempio, puoi semplicemente usarlo in questo modo:
this.radioButtonList1.DataSource = peopleTable;
this.radioButtonList1.DisplayMember = "Name";
this.radioButtonList1.ValueMember= "Id";
O ad esempio per un enum
, semplicemente in questo modo:
this.radioButtonList1.DataSource = Enum.GetValues(typeof(DayOfWeek));
Nell'immagine seguente, il secondo RadioButtonList
è disabilitato impostando Enabled = false;
:
Anche il controllo supporta anche da destra a sinistra:
Supporta anche multi-colonna:
RadioButtonList
Ecco il codice sorgente per il controllo. Puoi usarlo come un normale ListBox
aggiungendo elementi o impostando l'origine dati con / senza utilizzare l'associazione dati:
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; }
}
}
Il semplice fatto che diversi pulsanti di opzione si trovino nello stesso contenitore li rende reciprocamente esclusivi, non è necessario codificare questo comportamento da soli. Inseriscili in un Pannello o in GroupBox come suggerito da Matthew