【WinForms】カスタムイベントの基本学習

ボタンを押した時にイベントが発生することを利用してどのラジオボタンが押されたかをチェックします

基本コード

private void button1_Click(object sender, EventArgs e)
{
    foreach (RadioButton rb in groupBox1.Controls)
    {
        if (rb.Checked) 
        {
            MessageBox.Show(rb.Name);
        }
    }
}

リファクタリングしたコード

private void button1_Click(object sender, EventArgs e)
{
    ShowSelectedRadioButtonName();
}

private void ShowSelectedRadioButtonName()
{
    var selectedRadioButton = groupBox1.Controls.OfType<RadioButton>()
                                .FirstOrDefault(rb => rb.Checked);
    if (selectedRadioButton != null)
    {
        MessageBox.Show(selectedRadioButton.Name);
    }
}

主な変更点

  • ShowSelectedRadioButtonNameメソッドを新たに作成し、button1_Clickイベントハンドラから呼び出しています。これにより、イベントハンドラの役割を簡潔に保ちつつ、ラジオボタンの選択状態を確認し、選択されたボタンの名前を表示するロジックを別のメソッドに分離しています。
  • groupBox1.Controls.OfType<RadioButton>()を使用して、GroupBox内のコントロールからRadioButtonだけを選択します。これにより、明示的なキャストや型チェックの必要がなくなり、コードの安全性と読みやすさが向上します。
  • FirstOrDefaultメソッドを使用して、最初に見つかったチェックされたRadioButtonを取得します。これは、LINQを使用してコレクションを効率的に処理する一般的な方法です。

これらの変更により、コードの構造が改善され、将来的な変更やメンテナンスが容易になります。

サンプルを使って実行レベルで考えましょう

デザイン

イベント

コード

Form1.cs

using System;
using System.Windows.Forms;

namespace MultiFormChange
{
    public partial class Form1 : Form
    {
        public event EventHandler<MyEventArgs> OnRadioButtonChanged;
        public Form1()
        {
            InitializeComponent();
            OnRadioButtonChanged += Show;
        }

        private void Show(object sender, MyEventArgs e)
        {
            MessageBox.Show(e.SelectedRadioButton.Name);
        }

        private void radioButton_Click(object sender, EventArgs e)
        {
            OnRadioButtonChanged?.Invoke(sender, new MyEventArgs(groupBox1));
        }
    }
}

MyEventArgs.cs

using System;
using System.Linq;
using System.Windows.Forms;

namespace MultiFormChange
{
    public class MyEventArgs : EventArgs
    {
        private RadioButton selectedRadioButton;

        public MyEventArgs(GroupBox groupBox)
        {
            SelectedRadioButton = groupBox.Controls.OfType<RadioButton>()
                                 .FirstOrDefault(rb => rb.Checked);
        }

        public RadioButton SelectedRadioButton { get => selectedRadioButton; private set => selectedRadioButton = value; }
    }

}

実行結果

C#

Posted by hidepon