【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; }
}
}
ディスカッション
コメント一覧
まだ、コメントがありません