Windows Form 라디오 버튼을 그룹화하려면 어떻게합니까?


답변:


425

그룹의 모든 라디오 버튼을 a Panel또는 a 와 같은 컨테이너 객체에 넣 습니다 GroupBox. 그러면 Windows Forms에서 자동으로 그룹화됩니다.


13
@mohammadsadeghsaati 질문은 Windows Forms RadioButton에 관한 것이지만 GroupName 속성을 노출하지 않습니다.
UweB

2
@ UweB 어떤 문제로 인해 그룹 상자와 패널을 추가 할 수 없다면 양식에 공간이 충분하지 않다고 말할 수 있습니까? 그때?
무하마드 Saqib

2
@MuhammadSaqib 패널의 크기를 조정할 수 없기 때문에 불가능합니다. 테두리가 보이지 않고 여백이없는 패널은 일반 형식과 같습니다. 오른쪽 패널-TableLayoutPanel을 사용하여 테이블 등으로 그룹화 해야하는 경우
Alex Zhukovskiy

38

라디오 버튼을 GroupBox 에 넣는 것을보십시오 .


1
GroupBox는 라디오 버튼과 전혀 관련이 없습니다. 모든 컨테이너가 할 것입니다.
usr


24

WPF에서 RadioButton을 그룹화하는 개념이 마음에 듭니다. GroupName상호 배타적 인 RadioButton 컨트롤 ( http://msdn.microsoft.com/de-de/library/system.windows.controls.radiobutton.aspx ) 을 지정 하는 속성 이 있습니다.

그래서이 기능을 지원하는 WinForms에 대한 파생 클래스를 작성했습니다.

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
이것은 TableLayoutPanel 내부의 그룹에 RadioButton이 필요한 상황에서 유용했습니다. 감사합니다!
pelazem 2012 년

이 클래스를 내 양식 중 하나에 사용하려고하는데 그룹 상자의 제목처럼 컨트롤을 그룹 상자 위에 표시하는 데 문제가 있습니다. 최상위 라디오 버튼 역할을합니다 ( id est ,이 라디오 버튼의 그룹은 양식의 루트에있는 패널이고 그룹 상자는 형제입니다). 이 클래스를 사용하여 달성하는 방법에 대한 예제 코드가 있습니까?
Agi Hammerthief

나는 IEnumerable<Control> arbControls = null;동적을 사용하는 대신 쓸 것이다 . var마스크 그것은 훨씬 더, 나는 일반적으로 내 코드 만 명시 적 유형을 사용하는 이유의 그. 그렇지 않으면, 매우 좋은 일이며 이것을 공유해 주셔서 감사합니다! +1
sɐunıɔ ןɐ qɐp

11

패널이없는 라디오 버튼

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

GroupBox그러나 그룹 상자뿐만 아니라 Panels( System.Windows.Forms.Panel)를 사용할 수도 있습니다 .

  • 인터넷 프로토콜 버전 4 설정 대화 상자를 디자인 할 때 매우 유용합니다 (PC (Windows)로 확인하면 동작을 이해할 수 있습니다)

5

공유 컨테이너 내부의 모든 라디오 버튼 은 기본적으로 동일한 그룹 있습니다. 의미 중 하나를 확인하면 다른 것들은 선택 해제됩니다. 독립적 인 라디오 버튼 그룹을 만들려면 버튼과 같은 다른 컨테이너에 배치 Group Box하거나 코드 숨김 코드를 통해 체크 상태를 제어해야 합니다.


4

하나의 컨테이너에 넣을 수 없으면 각 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;
}

이렇게하면 무한 루프에 빠지게됩니다.
Michael Sandler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.