WinForms RadiobuttonList gibt es nicht?
-
06-07-2019 - |
Frage
ich weiß das WebForms
hat ein RadioButtonList
Kontrolle, aber ich kann keinen für finden WinForms
. Was ich brauche, ist, dass 3 Radiobuttons zusammen gruppiert sind, so dass jeweils nur 1 ausgewählt werden kann. Ich finde, dass ich dies durch Code tun muss, was ein Schmerz ist. Bin ich einfach nicht RadioButtonList
irgendwo oder existiert es wirklich nicht in WinForms
?
Lösung
Sie können drei Radiobuttons mit einer Groupbox oder einem Panel zusammenarbeiten Wie ist hier.
Andere Tipps
Wenn Sie nur Optionsschaltflächen gruppieren möchten, reicht es aus, sie in einen Container zu setzen, dann werden sie sich wie eine Gruppe verhalten. Wenn Sie jedoch Datenbindung benötigen, wie wie a ComboBox
oder ListBox
oder CheckedListBox
funktioniert, du brauchst eine RadioButtonList
Kontrolle.
Windows-Formulare haben keine integrierte Integration RadioButtonList
Kontrolle. Sie können Ihre eigene Kontrolle erstellen, indem Sie Formular abgeben ListBox
Und es Eigentümer zu machen und zeichnen SODTBLACKS selbst. So ist der Weg, der CheckedListBox
wird auch erstellt.
Auf diese Weise unterstützt die Steuerung die Datenbindung und profitiert von allen Funktionen von ListBox
, einschließlich DataSource
, SelectedValue
, DisplayMember
, ValueMember
usw. Zum Beispiel können Sie es einfach so verwenden:
this.radioButtonList1.DataSource = peopleTable;
this.radioButtonList1.DisplayMember = "Name";
this.radioButtonList1.ValueMember= "Id";
Oder zum Beispiel für eine enum
, einfach so:
this.radioButtonList1.DataSource = Enum.GetValues(typeof(DayOfWeek));
Im folgenden Bild die zweite RadioButtonList
wird durch Einstellung deaktiviert Enabled = false;
:
Auch das Steuerelement unterstützt von rechts nach links:
Es unterstützt auch Multi -Spalte:
Radiobuttonlist
Hier ist der Quellcode für die Kontrolle. Sie können es wie eine Normalität verwenden ListBox
Durch Hinzufügen von Elementen oder die Einstellung von Datenquellen mit/ohne Datenbindung:
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; }
}
}
Die einfache Tatsache, dass sich mehrere Optionsschaltflächen im selben Container befinden, macht sie gegenseitig ausschließend. Sie müssen dieses Verhalten nicht selbst codieren. Setzen Sie sie einfach in ein Panel oder eine Gruppentox, wie von Matthew vorgeschlagen