C# WinForms RadioButtonList不';不存在?

C# WinForms RadioButtonList不';不存在?,c#,winforms,radio-button,radiobuttonlist,C#,Winforms,Radio Button,Radiobuttonlist,我知道WebForms有一个RadioButtonList控件,但我找不到WinForms的控件。我需要的是将3个单选按钮组合在一起,以便一次只能选择1个。我发现我必须通过代码来实现这一点,这是一种痛苦。我只是在某处没有看到RadioButtonList,还是它真的不存在于WinForms中? 您可以使用GroupBox或Panel将三个单选按钮组合在一起。几个单选按钮位于同一容器中这一简单事实使它们相互排斥,您不必自己编写这种行为。只要按照Matthew的建议将它们放在面板或分组框中,如果您只

我知道
WebForms
有一个
RadioButtonList
控件,但我找不到
WinForms
的控件。我需要的是将3个单选按钮组合在一起,以便一次只能选择1个。我发现我必须通过代码来实现这一点,这是一种痛苦。我只是在某处没有看到
RadioButtonList
,还是它真的不存在于
WinForms
中?


您可以使用GroupBox或Panel将三个单选按钮组合在一起。

几个单选按钮位于同一容器中这一简单事实使它们相互排斥,您不必自己编写这种行为。只要按照Matthew的建议将它们放在面板或分组框中,如果您只想对单选按钮进行分组,将它们放在一个容器中就足够了,这样它们就会像一个组一样工作,但是如果您需要数据绑定,如or的工作方式,则需要一个
RadioButtonList
控件

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

这样,控件支持数据绑定,并将受益于
ListBox
的所有功能,包括
DataSource
SelectedValue
DisplayMember
ValueMember
等。例如,您可以这样简单地使用它:

this.radioButtonList1.DataSource = peopleTable; 
this.radioButtonList1.DisplayMember = "Name"; 
this.radioButtonList1.ValueMember= "Id";
this.radioButtonList1.DataSource = Enum.GetValues(typeof(DayOfWeek)); 
或者,例如,对于
枚举
,只需这样做:

this.radioButtonList1.DataSource = peopleTable; 
this.radioButtonList1.DisplayMember = "Name"; 
this.radioButtonList1.ValueMember= "Id";
this.radioButtonList1.DataSource = Enum.GetValues(typeof(DayOfWeek)); 
在下图中,通过设置
Enabled=false禁用第二个
RadioButtonList

该控件还支持从右向左:

它还支持多列:

单选按钮组 下面是控件的源代码。通过添加项目或设置数据源(使用/不使用数据绑定),您可以像使用普通的
列表框一样使用它:

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

奇怪的是,我把它们放在一个分组框中,但我认为它不起作用。非常感谢。是的,但是您失去了RadioButtonList值属性的功能及其数据绑定潜力。