WinFormsを使用します。グループのチェックされたRadioButtonを見つけるより良い方法はありますか?私には、以下のコードは必要ないはずです。別のRadioButtonをチェックすると、どのRadioButtonをオフにするかがわかります。したがって、どのRadioButtonがチェックされているかがわかるはずです。大量のifステートメント(または切り替え)を行わずにその情報を取得するにはどうすればよいですか。
RadioButton rb = null;
if (m_RadioButton1.Checked == true)
{
rb = m_RadioButton1;
}
else if (m_RadioButton2.Checked == true)
{
rb = m_RadioButton2;
}
else if (m_RadioButton3.Checked == true)
{
rb = m_RadioButton3;
}
LINQを使用できます。
var checkedButton = container.Controls.OfType<RadioButton>()
.FirstOrDefault(r => r.Checked);
これには、すべてのラジオボタンが同じコンテナ(パネルやフォームなど)に直接存在し、コンテナにグループが1つしかないことが必要であることに注意してください。そうでない場合は、コンストラクターで各グループのList<RadioButton>
sを作成し、list.FirstOrDefault(r => r.Checked)
を記述できます。
1つのハンドラーに対してすべてのボタンの CheckedEvents を配線できます。正しいチェックボックスを簡単に取得できます。
// Wire all events into this.
private void AllCheckBoxes_CheckedChanged(Object sender, EventArgs e) {
// Check of the raiser of the event is a checked Checkbox.
// Of course we also need to to cast it first.
if (((RadioButton)sender).Checked) {
// This is the correct control.
RadioButton rb = (RadioButton)sender;
}
}
LINQを使用しない場合:
RadioButton GetCheckedRadio(Control container)
{
foreach (var control in container.Controls)
{
RadioButton radio = control as RadioButton;
if (radio != null && radio.Checked)
{
return radio;
}
}
return null;
}
OPはチェックされたRadioButton BY GROUPを取得したかった。 @SLaksの回答は優れていますが、OPの主な質問には実際には答えていません。 @SLaksの答えを改善するには、LINQをさらに一歩進めてください。
これが、私自身の作業コードの例です。通常のWPFに従って、RadioButtonは、他の種類のコントロールを含むGrid
(名前は「myGrid」)に含まれています。グリッドには2つの異なるRadioButtonグループがあります。
特定のグループからチェック済みのRadioButtonを取得するには:
List<RadioButton> radioButtons = myGrid.Children.OfType<RadioButton>().ToList();
RadioButton rbTarget = radioButtons
.Where(r => r.GroupName == "GroupName" && r.IsChecked)
.Single();
コードにRadioButtonsがチェックされていない可能性がある場合は、SingleOrDefault()
を使用します(トライステートボタンを使用していない場合は、常に1つのボタンをデフォルトの選択として「IsChecked」に設定します)。
すべてのRadioButtonに対して CheckedChanged イベントを使用できます。 Sender
は、チェックされていないラジオボタンとチェックされているラジオボタンです。
CheckedChangedEventワイヤリングに加えて、Controlsの「Tag」プロパティを使用してラジオボタンを区別できます...(スパゲッティコード)の代替は「TabIndex」プロパティです; P
このような状況では、Accessが私の選択の毒であった若さを懐かしく思うことがあり、グループ内の各ラジオボタンに独自の値を与えることができました。
C#での私のハックは、タグを使用して値を設定することです。グループから選択を行うと、選択したラジオボタンのタグの値を読み取ります。この例では、directionGroupは、「None」および「NE」、「SE」、「NW」および「SW」が他の4つのタグとして4つの5つのラジオボタンがあるグループです。ラジオボタン。
1つのイベントハンドラーをすべてのボタンのCHeckCHangedイベントに割り当てると、ボタンを変更するとすべてが変更されるため、ボタンを積極的に使用してチェックボタンの値をキャプチャしました。したがって、senderの値は常にグループの最初のRadioButtonです。代わりに、どのRadioButtonのTagプロパティで取得する値を使用して、どれが選択されているかを調べる必要がある場合に、このメソッドを使用します。
private void ShowSelectedRadioButton()
{
List<RadioButton> buttons = new List<RadioButton>();
string selectedTag = "No selection";
foreach (Control c in directionGroup.Controls)
{
if (c.GetType() == typeof(RadioButton))
{
buttons.Add((RadioButton)c);
}
}
var selectedRb = (from rb in buttons where rb.Checked == true select rb).FirstOrDefault();
if (selectedRb!=null)
{
selectedTag = selectedRb.Tag.ToString();
}
FormattableString result = $"Selected Radio button tag ={selectedTag}";
MessageBox.Show(result.ToString());
}
参考までに、私は自分の仕事でこれをテストして使用しました。
ジョーイ
Extensionメソッドを使用して、RadioButtonのParent.Controlsコレクションを反復処理できます。これにより、同じスコープ内の他のRadioButtonを照会できます。 2つの拡張メソッドを使用すると、最初の方法を使用してグループ内のRadioButtonが選択されているかどうかを判断し、2番目の方法を使用して選択を取得できます。 RadioButton Tagフィールドを使用して、グループ内の各RadioButtonを識別するEnumを保持できます。
public static int GetRadioSelection(this RadioButton rb, int Default = -1) {
foreach(Control c in rb.Parent.Controls) {
RadioButton r = c as RadioButton;
if(r != null && r.Checked) return Int32.Parse((string)r.Tag);
}
return Default;
}
public static bool IsRadioSelected(this RadioButton rb) {
foreach(Control c in rb.Parent.Controls) {
RadioButton r = c as RadioButton;
if(r != null && r.Checked) return true;
}
return false;
}
典型的な使用パターンは次のとおりです。
if(!MyRadioButton.IsRadioSelected()) {
MessageBox.Show("No radio selected.");
return;
}
int selection = MyRadioButton.GetRadioSelection;
コントロール内で選択したラジオボタンのインデックスを取得する場合、このメソッドを使用できます。
public static int getCheckedRadioButton(Control c)
{
int i;
try
{
Control.ControlCollection cc = c.Controls;
for (i = 0; i < cc.Count; i++)
{
RadioButton rb = cc[i] as RadioButton;
if (rb.Checked)
{
return i;
}
}
}
catch
{
i = -1;
}
return i;
}
使用例:
int index = getCheckedRadioButton(panel1);
コードはそれほどよくテストされていませんが、テキストを読むときのように、インデックスの順序は左から右、上から下のようです。ラジオボタンが見つからない場合、メソッドは-1を返します。
更新:コントロール内にラジオボタンがない場合、私の最初の試みは機能しませんでした。私はそれを修正するためにtry and catchブロックを追加しましたが、このメソッドは今では機能しているようです。
選択内容をファイルなどに保存して後で呼び出す場合は、ここで何をしますか
string[] lines = new string[1];
lines[0] = groupBoxTes.Controls.OfType<RadioButton>()
.FirstOrDefault(r => r.Checked).Text;
File.WriteAllLines("Config.ini", lines);
でそれを呼び出す
string[] ini = File.ReadAllLines("Config.ini");
groupBoxTes.Controls.OfType<RadioButton>()
.FirstOrDefault(r => (r.Text == ini[0])).Checked = true;
WinFormsを使用している場合、GroupBoxにはこの目的のためのValidatedイベントがあります。
private void grpBox_Validated(object sender, EventArgs e)
{
GroupBox g = sender as GroupBox;
var a = from RadioButton r in g.Controls
where r.Checked == true select r.Name;
strChecked = a.First();
}
VB.NETを使用する開発者向け
Private Function GetCheckedRadio(container) As RadioButton
For Each control In container.Children
Dim radio As RadioButton = TryCast(control, RadioButton)
If radio IsNot Nothing AndAlso radio.IsChecked Then
Return radio
End If
Next
Return Nothing
End Function