的WinForms单选按钮列表不存在?的WinForms单选按钮列表不存在?(WinForms Ra

2019-05-13 12:21发布

我知道WebForms有一个RadioButtonList控制,但我无法找到一个对WinForms 。 我需要的是有3个单选按钮组合在一起,这样只有1可以一次选择。 我发现,我必须通过代码来做到这一点,这是一种痛苦。 我只是没有看到RadioButtonList地方呢,还是真的不中不存在WinForms

Answer 1:

显然不是 。

您可以三人小组单选按钮一起使用分组框或面板的都在这里完成 。



Answer 2:

如果你只是想组单选按钮,它足以把它们放在一个容器中,然后他们会像一群,但如果你需要像一个怎样的数据绑定ComboBoxListBoxCheckedListBox工作,你需要一个RadioButtonList控制。

Windows窗体不具有一个内置的RadioButtonList控制。 您可以通过派生形式创建自己的控制ListBox ,并使其所有者绘制,绘制单选按钮自己。 这是方式CheckedListBox被创建。

这样一来,该控件支持数据绑定和将所有的功能中获益ListBox ,包括DataSourceSelectedValueDisplayMemberValueMember等。 例如,你可以简单地使用这种方式:

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


Answer 3:

一个简单的事实,一些单选按钮都在同一容器中,使它们相互排斥的,您不必自己编写这种行为。 只要把他们一个小组或分组框在马修的建议



文章来源: WinForms RadioButtonList doesn't exist?