我知道它WebForms
有一个RadioButtonList
控件,但我找不到一个WinForms
。我需要将 3 个 RadioButtons 组合在一起,以便一次只能选择 1 个。我发现我必须通过代码来做到这一点,这很痛苦。我只是没有在RadioButtonList
某个地方看到,还是它真的不存在WinForms
?
问问题
24854 次
3 回答
20
如果您只想对单选按钮进行分组,将它们放在一个容器中就足够了,那么它们将像一个组一样工作,但是如果您需要数据绑定,例如 a ComboBox
or ListBox
or的CheckedListBox
工作方式,则需要一个RadioButtonList
控件。
Windows 窗体没有内置RadioButtonList
控件。ListBox
您可以通过派生表单并使其所有者绘制和自己绘制单选按钮来创建自己的控件。这也是CheckedListBox
被创建的方式。
这样,该控件就支持数据绑定,并将受益于 的所有功能ListBox
,包括DataSource
、SelectedValue
、DisplayMember
等ValueMember
。例如,您可以简单地以这种方式使用它:
this.radioButtonList1.DataSource = peopleTable;
this.radioButtonList1.DisplayMember = "Name";
this.radioButtonList1.ValueMember= "Id";
或者例如对于一个enum
,简单地这样:
this.radioButtonList1.DataSource = Enum.GetValues(typeof(DayOfWeek));
在下图中,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; }
}
}
于 2016-12-28T04:37:02.933 回答
4
多个单选按钮位于同一个容器中这一简单事实使它们相互排斥,您不必自己编写此行为的代码。只需按照 Matthew 的建议将它们放在 Panel 或 GroupBox 中
于 2009-06-18T22:03:51.037 回答