سؤال

وأنا أعلم أن WebForms لديه سيطرة RadioButtonList، ولكن لا أستطيع أن أجد واحدة لWinForms. ما احتاج اليه هو لدينا 3 RadioButtons تجميعها معا، بحيث يمكن تحديد 1 فقط في المرة الواحدة. أنا وجدت أن لا بد لي من القيام بذلك من خلال الرمز، الذي هو الألم. أنا فقط لا نرى RadioButtonList في مكان ما، أو هل حقا لا وجود لها في WinForms؟

هل كانت مفيدة؟

المحلول

على ما يبدو لا .

ويمكنك مجموعة ثلاثة RadioButtons معا يستخدم GroupBox أو لوحة كما هو الحال هنا .

نصائح أخرى

إذا كنت ترغب فقط في أزرار مجموعة، يكفي لوضعها في وعاء، ثم أنها سوف تتصرف مثل مجموعة، ولكن اذا كنت بحاجة الى بيانات ملزمة مثل كيف يمكن لComboBox أو ListBox أو CheckedListBox الأعمال، كنت في حاجة الى RadioButtonList السيطرة.

وأشكال ويندوز لايوجد المدمج في السيطرة 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; }
    }
}

والحقيقة البسيطة أن العديد من أزرار الراديو هي في نفس الحاوية يجعلها يستبعد بعضها بعضا، لم يكن لديك لرمز هذا السلوك نفسك. مجرد وضعها في لوحة أو GroupBox على النحو الذي اقترحه ماثيو

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top