WinForms RadioButtonList不存在?

我知道WebForms有一个RadioButtonList控件,但我找不到一个WinForms 。 我需要的是将3个RadioButton组合在一起,这样一次只能选择1个。 我发现我必须通过代码执行此操作,这很痛苦。 我只是在某处看不到RadioButtonList ,还是在WinForms确实不存在?

显然不是 。

您可以使用GroupBox或Panel 将三个RadioButton组合在一起,如此处所示 。

如果你只想组合单选按钮,它就足以将它们放在一个容器中,那么它们就像一个组一样,但如果你需要像ComboBoxListBoxCheckedListBox工作的数据绑定,你需要一个RadioButtonList控件。

Windows窗体没有内置的RadioButtonList控件。 您可以通过派生表单ListBox并使其自己绘制并自己绘制单选按钮来创建自己的控件。 这也是CheckedListBox的创建方式。

这样,控件支持数据绑定,并将受益于ListBox所有function,包括DataSourceSelectedValueDisplayMemberValueMember等。 例如,您可以这样简单地使用它:

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

或者例如对于enum ,只需这样:

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

在下图中,通过设置Enabled = false;禁用第二个RadioButtonList Enabled = false;

在此处输入图像描述 在此处输入图像描述

此外,控件也支持从右到左:

在此处输入图像描述

它还支持多列:

在此处输入图像描述

单选按钮列表

这是控制的源代码。 通过使用/不使用数据绑定添加项目或设置数据源,您可以像普通ListBox一样使用它:

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

几个单选按钮位于同一个容器中的简单事实使它们互相排斥,您不必自己编写此行为。 只需按照Matthew的建议将它们放在Panel或GroupBox中