Làm cách nào để nhóm các nút radio của Windows Form?


315

Làm cách nào tôi có thể nhóm các nút radio trong ứng dụng Windows Form (rất giống với danh sách phát thanh của ASP.NET!)?

Vì vậy, tôi có thể chuyển đổi giữa từng trường hợp được chọn từ các tùy chọn.



Xem ảnh chụp màn hình: stackoverflow.com/a/46424314/984780
Luis Perez

Câu trả lời:


425

Đặt tất cả các nút radio cho một nhóm trong một đối tượng chứa như a Panelhoặc a GroupBox. Điều đó sẽ tự động nhóm chúng lại với nhau trong Windows Forms.


13
@mohammadsadeghsaati Câu hỏi là về Windows Forms RadioButton, nó không để lộ thuộc tính GroupName.
UweB

2
@UweB điều gì xảy ra nếu tôi không thể thêm các hộp và bảng nhóm do bất kỳ vấn đề nào, giả sử tôi không có nhiều không gian trên biểu mẫu của mình. Sau đó?
Muhammad Saqib

2
@MuhammadSaqib không thể vì các bảng có thể có kích thước bằng không. Tôi có nghĩa là bảng có đường viền vô hình và không có lề là giống như hình thức đơn giản. Chỉ cần sử dụng bảng bên phải - TableLayoutPanel nếu bạn nên nhóm trong bảng, v.v.
Alex Zhukovskiy

38

Nhìn vào việc đặt các nút radio của bạn trong GroupBox .


1
GroupBox hoàn toàn không liên quan đến các nút radio. Bất kỳ container sẽ làm.
usr

30

Bạn nên đặt tất cả các nút radio của nhóm trong cùng một thùng chứa như GroupBox hoặc Bảng điều khiển.


1
Nó trở nên phức tạp khi bạn có các lớp bảng được lồng vào nhau, chẳng hạn như khi bạn đang cố gắng làm một cái gì đó trông như thế này . Các nút radio xung đột với cha mẹ của họ.
Búa búa Agi

24

Tôi thích khái niệm nhóm RadioButtons trong WPF. Có một thuộc tính GroupNamechỉ định các điều khiển RadioButton nào loại trừ lẫn nhau ( http://msdn.microsoft.com/de-de/l Library / system.windows.controls.radiobutton.aspx ).

Vì vậy, tôi đã viết một lớp dẫn xuất cho WinForms hỗ trợ tính năng này:

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
Điều này rất hữu ích cho tôi trong tình huống tôi cần RadioButtons trong một nhóm trong TableLayoutPanel - cảm ơn bạn!
pelazem

Tôi đang cố gắng sử dụng lớp này cho một trong các hình thức của riêng mình, nhưng gặp khó khăn khi điều khiển hiển thị trên đầu hộp nhóm (như thể đó là tiêu đề của hộp nhóm). Nó có nghĩa là đóng vai trò là nút radio cấp cao nhất ( id est , nhóm cho nút radio này là một bảng ở gốc của biểu mẫu và hộp nhóm là anh chị em). Có mã ví dụ nào về cách sử dụng lớp này để đạt được điều đó không?
Búa búa Agi

Tôi sẽ viết IEnumerable<Control> arbControls = null;thay vì sử dụng năng động. Các varmặt nạ nó thậm chí nhiều hơn, và đó là lý do tại sao tôi thường chỉ sử dụng loại rõ ràng trong mã của tôi. Nếu không, công việc rất tốt, và cảm ơn rất nhiều vì đã chia sẻ điều này! +1
sunıɔ qɐp

11

Nút radio không có bảng điều khiển

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

GroupBoxlà tốt hơn. Nhưng không chỉ hộp nhóm, thậm chí bạn có thể sử dụng Panels( System.Windows.Forms.Panel).

  • Điều đó rất hữu ích khi bạn đang thiết kế hộp thoại cài đặt Giao thức Internet phiên bản 4. (Kiểm tra nó với máy tính của bạn (windows), sau đó bạn có thể hiểu hành vi)

5

Tất cả các nút radio bên trong một container cổ phiếu đang ở trong cùng một nhóm theo mặc định . Có nghĩa là, nếu bạn kiểm tra một trong số chúng - những người khác sẽ bị bỏ chọn. Nếu bạn muốn tạo các nhóm nút radio độc lập, bạn phải đặt chúng vào các thùng chứa khác nhau Group Box, hoặc kiểm soát trạng thái Đã kiểm tra của chúng thông qua mã phía sau .


4

Nếu bạn không thể đặt chúng vào một thùng chứa, thì bạn phải viết mã để thay đổi trạng thái đã kiểm tra của từng 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;
}

Điều này sẽ đưa bạn vào một vòng lặp vô hạn ,,,
Michael Sandler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.