본문 바로가기
백엔드/C#

라디오버튼을 클릭해서 체크 해제하고 싶은 경우

by 1005ptr 2021. 4. 26.
반응형

라디오버튼의 여러개중에 하나만 선택되는 기능을 사용하면서

체크박스처럼 체크상태에서 체크하면 체크해제도 돼야하는 경우

 

라디오버튼을 사용하고

라디오버튼의 Click 이벤트와 ChechedChanged 이벤트를 활용하면 된다.

 

 

먼저 라디오버튼의 Click, CheckedChanged 이벤트 호출 순서를 알아본다.

콘솔에 상태를 찍는 코드를 작성하고

        public Form1()
        {
            InitializeComponent();
            this.radioButton2.CheckedChanged += new EventHandler(radioButton_CheckedChanged);
            this.radioButton1.CheckedChanged += new EventHandler(radioButton_CheckedChanged);
            this.radioButton2.Click += new EventHandler(radioButton_Click);
            this.radioButton1.Click += new EventHandler(radioButton_Click);
        }

        void radioButton_Click(object sender, EventArgs e)
        {
            RadioButton rdo = sender as RadioButton;
            Console.WriteLine(rdo.Name + " Clicked : " + rdo.Checked);
        }

        void radioButton_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rdo = sender as RadioButton;
            Console.WriteLine(rdo.Name + " CheckedChanged : " + rdo.Checked);
        }

 

실행해 보면

1. CheckedChanged : False

2. CheckedChanged : True

3. Clicked : True

가 호출되고있다.

 

알수있는건

- CheckedChanged가 호출되고 Clicked가 호출된다는 점

- CheckedChanged는 false가 호출되고 true가 호출된다는 점

 

이걸 알고 나면

아래처럼 코드를 짜면 안된다는걸 알 수 있다. (Click이벤트에는 항상 Checked == TRUE 인 상태로 들어온다.)

물론 AutoCheck 속성을 false로 하고 이것저것 작성할 수는 있는데

그렇게 되면 라디오버튼의 하나만 선택되는 기능이 깨져서 라디오버튼을 쓰는 의미가 없어진다.

        public Form1()
        {
            InitializeComponent();
            this.radioButton2.Click += new EventHandler(radioButton_Click);
            this.radioButton1.Click += new EventHandler(radioButton_Click);
        }

        void radioButton_Click(object sender, EventArgs e)
        {
            RadioButton rdo = sender as RadioButton;
            if (rdo.Checked) rdo.Checked = false;
            else rdo.Checked = true;
        }

 

그래서 어떻게 하면 될까

CheckedChanged가 호출되고 Click이 호출된다는 점

Checked == TRUE인 상태에서 클릭하면 CheckedChanged가 호출되지 않는다는 점을 활용하면 된다.

        private bool radioCheckedChanged = false;
        public Form1()
        {
            InitializeComponent();
            this.radioButton2.CheckedChanged += new EventHandler(radioButton_CheckedChanged);
            this.radioButton1.CheckedChanged += new EventHandler(radioButton_CheckedChanged);
            this.radioButton2.Click += new EventHandler(radioButton_Click);
            this.radioButton1.Click += new EventHandler(radioButton_Click);
        }

        void radioButton_Click(object sender, EventArgs e)
        {
            RadioButton rdo = sender as RadioButton;
            if (radioCheckedChanged == false)
            {
                rdo.Checked = false;
            }
            radioCheckedChanged = false;
        }

        void radioButton_CheckedChanged(object sender, EventArgs e)
        {
            radioCheckedChanged = true;
        }
반응형

댓글