一度に1つだけを選択する必要があるラジオボタンがいくつかあるフォームがあります。
一部のラジオボタンは接続されており、ヘッダーで説明する必要があります。このために私はそれらをグループボックスに入れました。ただし、グループボックス内のラジオボタンは外部のラジオボタンに接続されなくなり、2つ選択できるようになります。
ラジオボタンを接続して、すべてが互いに反応するようにする方法はありますか?または、グループボックスを使用してラジオボタンをグループ化して説明するためのより良い方法はありますか?
一度に1つだけを選択する必要があるラジオボタンがいくつかあるフォームがあります。
一部のラジオボタンは接続されており、ヘッダーで説明する必要があります。このために私はそれらをグループボックスに入れました。ただし、グループボックス内のラジオボタンは外部のラジオボタンに接続されなくなり、2つ選択できるようになります。
ラジオボタンを接続して、すべてが互いに反応するようにする方法はありますか?または、グループボックスを使用してラジオボタンをグループ化して説明するためのより良い方法はありますか?
これは、 MSDNに従ってコンテナごとにグループ化されるRadioButtonの設計された動作です。
ユーザーがグループ内の1つのオプションボタン(ラジオボタンとも呼ばれます)を選択すると、他のボタンは自動的にクリアされます。フォームなどの特定のコンテナ内のすべてのRadioButtonコントロールは、グループを構成します。1つのフォームに複数のグループを作成するには、各グループをGroupBoxやPanelコントロールなどの独自のコンテナーに配置します。
リンクするRadioButtonに共通のイベントハンドラーを使用して、自分でチェック/チェック解除を処理することもできます。または、RadioButtonをGroupBoxに追加せずに、GroupBoxの上に配置してBringToFrontにすることもできます。
これは可能ですが、高額になります。AutoCheckプロパティをfalseに設定し、他のボタンのチェックを自分でオフにする必要があります。もう正しく機能しない最も厄介なことはタブストップです。グループ化されたボタンのセットにはタブストップが1つしかありませんが、AutoCheck = falseに設定すると、すべてのボタンにタブで移動できます。
最大の問題は間違いなく、ユーザーに与えるかなりの混乱です。あまりにも多く、代わりにチェックボックスを検討する必要があります。
Windowsフォームでは、ラジオボタンをグループ化する簡単な方法(GroupNameなどのプロパティの設定など)はないと思います。最も簡単な方法は、コレクション内のラジオボタンをグループ化して、checkedchangedイベントをリッスンすることです。例えば:
var rbuttons = new List<RadioButton>{ radioButton1, radioButton2, radioButton3, radioButton4 }; //or get them dynamically..
rbuttons.ForEach(r => r.CheckedChanged += (o, e) =>
{
if (r.Checked) rbuttons.ForEach(rb => rb.Checked = rb == r);
});
リスト内のラジオボタンのいずれかがチェックされている場合、他のラジオボタンは自動的にオフになります
CheckChangedイベントを処理することでこれを解決しました。
private void radio1_CheckedChanged(object sender, EventArgs e)
{
if (radio1.Checked)
{
// do stuff
radio2.Checked = false;
}
}
private void radio2_CheckedChanged(object sender, EventArgs e)
{
if (radio2.Checked)
{
// do stuff
radio1.Checked = false;
}
}