Frage

ich weiß das WebForms hat ein RadioButtonList Kontrolle, aber ich kann keinen für finden WinForms. Was ich brauche, ist, dass 3 Radiobuttons zusammen gruppiert sind, so dass jeweils nur 1 ausgewählt werden kann. Ich finde, dass ich dies durch Code tun muss, was ein Schmerz ist. Bin ich einfach nicht RadioButtonList irgendwo oder existiert es wirklich nicht in WinForms?

War es hilfreich?

Lösung

Scheinbar nicht.

Sie können drei Radiobuttons mit einer Groupbox oder einem Panel zusammenarbeiten Wie ist hier.

Andere Tipps

Wenn Sie nur Optionsschaltflächen gruppieren möchten, reicht es aus, sie in einen Container zu setzen, dann werden sie sich wie eine Gruppe verhalten. Wenn Sie jedoch Datenbindung benötigen, wie wie a ComboBox oder ListBox oder CheckedListBox funktioniert, du brauchst eine RadioButtonList Kontrolle.

Windows-Formulare haben keine integrierte Integration RadioButtonList Kontrolle. Sie können Ihre eigene Kontrolle erstellen, indem Sie Formular abgeben ListBox Und es Eigentümer zu machen und zeichnen SODTBLACKS selbst. So ist der Weg, der CheckedListBox wird auch erstellt.

Auf diese Weise unterstützt die Steuerung die Datenbindung und profitiert von allen Funktionen von ListBox, einschließlich DataSource, SelectedValue, DisplayMember, ValueMember usw. Zum Beispiel können Sie es einfach so verwenden:

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

Oder zum Beispiel für eine enum, einfach so:

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

Im folgenden Bild die zweite RadioButtonList wird durch Einstellung deaktiviert Enabled = false;:

enter image description here enter image description here

Auch das Steuerelement unterstützt von rechts nach links:

enter image description here

Es unterstützt auch Multi -Spalte:

enter image description here

Radiobuttonlist

Hier ist der Quellcode für die Kontrolle. Sie können es wie eine Normalität verwenden ListBox Durch Hinzufügen von Elementen oder die Einstellung von Datenquellen mit/ohne Datenbindung:

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

Die einfache Tatsache, dass sich mehrere Optionsschaltflächen im selben Container befinden, macht sie gegenseitig ausschließend. Sie müssen dieses Verhalten nicht selbst codieren. Setzen Sie sie einfach in ein Panel oder eine Gruppentox, wie von Matthew vorgeschlagen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top