WinForms RadioButtonList не существует?

Я знаю, что WebForms имеет RadioButtonList элемент управления, но я не могу найти его для WinForms. Мне нужно сгруппировать 3 RadioButton, чтобы можно было выбрать только 1 за раз. Я обнаружил, что мне нужно делать это с помощью кода, а это неприятно. Я просто где-то не вижу RadioButtonList, или его действительно нет в WinForms?


person Ryan Abbott    schedule 18.06.2009    source источник


Ответы (3)


По-видимому, нет.

Вы можете сгруппировать три RadioButton вместе, используя GroupBox или Panel , как это сделано здесь.

person Matthew Jones    schedule 18.06.2009
comment
Странно, я группировал их в GroupBox, но думал, что это не работает. Спасибо! - person Ryan Abbott; 19.06.2009
comment
Да, но вы теряете функцию свойства RadioButtonList Value и его потенциал связывания данных. - person ProfK; 08.10.2012

Если вы просто хотите сгруппировать переключатели, достаточно поместить их в контейнер, тогда они будут действовать как группа, но если вам нужна привязка данных, например, как _ 1_ или _ 2_ или 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;:

введите здесь описание изображения  введите описание изображения здесь

Также элемент управления поддерживает справа налево:

введите описание изображения здесь

Он также поддерживает несколько столбцов:

введите описание изображения здесь

RadioButtonList

Вот исходный код для управления. Вы можете использовать его как обычный 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; }
    }
}
person Reza Aghaei    schedule 28.12.2016

Тот простой факт, что несколько переключателей находятся в одном контейнере, делает их взаимоисключающими, вам не нужно кодировать это поведение самостоятельно. Просто поместите их в Panel или GroupBox, как предлагает Мэтью.

person Thomas Levesque    schedule 18.06.2009