Bagaimana cara saya mengelompokkan tombol radio Windows Form?


Jawaban:


425

Letakkan semua tombol radio untuk grup di objek wadah seperti a Panelatau a GroupBox. Itu akan secara otomatis mengelompokkan mereka dalam Formulir Windows.


13
@mohammadsadeghsaati Pertanyaannya adalah tentang Windows Forms RadioButton, itu tidak memperlihatkan properti GroupName.
UweB

2
@UweB bagaimana jika saya tidak bisa menambahkan kotak dan panel grup karena masalah apa pun katakanlah saya tidak punya banyak ruang di formulir saya. Kemudian?
Muhammad Saqib

2
@MuhammadSaqib tidak mungkin karena panel bisa berukuran nol. Maksud saya panel dengan batas yang tidak terlihat dan tanpa margin sama dengan bentuk polos. Cukup gunakan panel kanan - TableLayoutPanel jika Anda harus mengelompokkan dalam tabel dll
Alex Zhukovskiy

38

Lihatlah menempatkan tombol radio Anda di GroupBox .


1
GroupBox sama sekali tidak terkait dengan tombol radio. Wadah apa pun akan dilakukan.
usr


24

Saya suka konsep pengelompokan RadioButtons di WPF. Ada properti GroupNameyang menentukan kontrol RadioButton yang saling eksklusif ( http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx ).

Jadi saya menulis kelas turunan untuk WinForms yang mendukung fitur ini:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Windows.Forms.VisualStyles;
using System.Drawing;
using System.ComponentModel;

namespace Use.your.own
{
    public class AdvancedRadioButton : CheckBox
    {
        public enum Level { Parent, Form };

        [Category("AdvancedRadioButton"),
        Description("Gets or sets the level that specifies which RadioButton controls are affected."),
        DefaultValue(Level.Parent)]
        public Level GroupNameLevel { get; set; }

        [Category("AdvancedRadioButton"),
        Description("Gets or sets the name that specifies which RadioButton controls are mutually exclusive.")]
        public string GroupName { get; set; }

        protected override void OnCheckedChanged(EventArgs e)
        {
            base.OnCheckedChanged(e);

            if (Checked)
            {
                var arbControls = (dynamic)null;
                switch (GroupNameLevel)
                {
                    case Level.Parent:
                        if (this.Parent != null)
                            arbControls = GetAll(this.Parent, typeof(AdvancedRadioButton));
                        break;
                    case Level.Form:
                        Form form = this.FindForm();
                        if (form != null)
                            arbControls = GetAll(this.FindForm(), typeof(AdvancedRadioButton));
                        break;
                }
                if (arbControls != null)
                    foreach (Control control in arbControls)
                        if (control != this &&
                            (control as AdvancedRadioButton).GroupName == this.GroupName)
                            (control as AdvancedRadioButton).Checked = false;
            }
        }

        protected override void OnClick(EventArgs e)
        {
            if (!Checked)
                base.OnClick(e);
        }

        protected override void OnPaint(PaintEventArgs pevent)
        {
            CheckBoxRenderer.DrawParentBackground(pevent.Graphics, pevent.ClipRectangle, this);

            RadioButtonState radioButtonState;
            if (Checked)
            {
                radioButtonState = RadioButtonState.CheckedNormal;
                if (Focused)
                    radioButtonState = RadioButtonState.CheckedHot;
                if (!Enabled)
                    radioButtonState = RadioButtonState.CheckedDisabled;
            }
            else
            {
                radioButtonState = RadioButtonState.UncheckedNormal;
                if (Focused)
                    radioButtonState = RadioButtonState.UncheckedHot;
                if (!Enabled)
                    radioButtonState = RadioButtonState.UncheckedDisabled;
            }

            Size glyphSize = RadioButtonRenderer.GetGlyphSize(pevent.Graphics, radioButtonState);
            Rectangle rect = pevent.ClipRectangle;
            rect.Width -= glyphSize.Width;
            rect.Location = new Point(rect.Left + glyphSize.Width, rect.Top);

            RadioButtonRenderer.DrawRadioButton(pevent.Graphics, new System.Drawing.Point(0, rect.Height / 2 - glyphSize.Height / 2), rect, this.Text, this.Font, this.Focused, radioButtonState);
        }

        private IEnumerable<Control> GetAll(Control control, Type type)
        {
            var controls = control.Controls.Cast<Control>();

            return controls.SelectMany(ctrl => GetAll(ctrl, type))
                                      .Concat(controls)
                                      .Where(c => c.GetType() == type);
        }
    }
}

3
Ini berguna bagi saya dalam situasi di mana saya membutuhkan RadioButtons dalam grup di dalam TableLayoutPanel - terima kasih!
pelazem

Saya mencoba menggunakan kelas ini untuk salah satu formulir saya sendiri, tetapi mengalami kesulitan mendapatkan kontrol untuk ditampilkan di atas kotak grup (seolah-olah itu adalah judul kotak grup). Ini dimaksudkan untuk berfungsi sebagai tombol radio tingkat atas ( id est , grup untuk tombol radio ini adalah panel di akar formulir dan kotak grup adalah saudara kandung). Apakah ada kode contoh tentang cara menggunakan kelas ini untuk mencapai itu?
Agi Hammerthief

Saya akan menulis IEnumerable<Control> arbControls = null;alih-alih menggunakan dinamis. The varmasker bahkan lebih, dan bahwa ini mengapa saya biasanya hanya menggunakan jenis eksplisit dalam kode saya. Kalau tidak, pekerjaan yang sangat baik, dan terima kasih banyak untuk berbagi ini! +1
sɐunıɔ ןɐ qɐp

11

Tombol radio tanpa panel

public class RadioButton2 : RadioButton
{
   public string GroupName { get; set; }
}

private void RadioButton2_Clicked(object sender, EventArgs e)
{
    RadioButton2 rb = (sender as RadioButton2);

    if (!rb.Checked)
    {
       foreach (var c in Controls)
       {
           if (c is RadioButton2 && (c as RadioButton2).GroupName == rb.GroupName)
           {
              (c as RadioButton2).Checked = false;
           }
       }

       rb.Checked = true;
    }
}

private void Form1_Load(object sender, EventArgs e)
{
    //a group
    RadioButton2 rb1 = new RadioButton2();
    rb1.Text = "radio1";
    rb1.AutoSize = true;
    rb1.AutoCheck = false;
    rb1.Top = 50;
    rb1.Left = 50;
    rb1.GroupName = "a";
    rb1.Click += RadioButton2_Clicked;
    Controls.Add(rb1);

    RadioButton2 rb2 = new RadioButton2();
    rb2.Text = "radio2";
    rb2.AutoSize = true;
    rb2.AutoCheck = false;
    rb2.Top = 50;
    rb2.Left = 100;
    rb2.GroupName = "a";
    rb2.Click += RadioButton2_Clicked;
    Controls.Add(rb2);

    //b group
    RadioButton2 rb3 = new RadioButton2();
    rb3.Text = "radio3";
    rb3.AutoSize = true;
    rb3.AutoCheck = false;
    rb3.Top = 80;
    rb3.Left = 50;
    rb3.GroupName = "b";
    rb3.Click += RadioButton2_Clicked;
    Controls.Add(rb3);

    RadioButton2 rb4 = new RadioButton2();
    rb4.Text = "radio4";
    rb4.AutoSize = true;
    rb4.AutoCheck = false;
    rb4.Top = 80;
    rb4.Left = 100;
    rb4.GroupName = "b";
    rb4.Click += RadioButton2_Clicked;
    Controls.Add(rb4);
}


5

GroupBoxlebih baik. Tapi tidak hanya kotak grup, bahkan Anda dapat menggunakan Panels( System.Windows.Forms.Panel).

  • Itu sangat berguna ketika Anda merancang dialog pengaturan versi Internet Protocol 4. (Periksa dengan pc Anda (windows), maka Anda dapat memahami perilaku)

5

Semua tombol radio di dalam wadah berbagi berada di grup yang sama secara default . Berarti, jika Anda memeriksa salah satunya - yang lain tidak akan dicentang. Jika Anda ingin membuat grup independen dari tombol radio, Anda harus menempatkannya ke dalam wadah yang berbeda seperti Group Box, atau mengontrol negara diperiksa melalui kode di belakang .


4

Jika Anda tidak bisa memasukkannya ke dalam satu wadah, maka Anda harus menulis kode untuk mengubah keadaan diperiksa dari setiap RadioButton :

private void rbDataSourceFile_CheckedChanged(object sender, EventArgs e)
{
    rbDataSourceNet.Checked = !rbDataSourceFile.Checked;
}

private void rbDataSourceNet_CheckedChanged(object sender, EventArgs e)
{
  rbDataSourceFile.Checked = !rbDataSourceNet.Checked;
}

Ini akan membuat Anda berada dalam loop tanpa batas ,,,
Michael Sandler
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.