グループ内のどのラジオボタンがチェックされますか?


118

WinFormsの使用。グループのチェック済み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;
     }

1
基になるコードは、チェックを外すものを認識していません。変更されたコントロールの同じ親の下にあるすべてのRadioButtonコントロールを繰り返し、以前にチェックされたコントロールのチェックを外します。
ジョアンアンジェロ

1
WinFormsまたはASP.Netを使用していますか?
SLaks、2009年

回答:


219

LINQを使用できます。

var checkedButton = container.Controls.OfType<RadioButton>()
                                      .FirstOrDefault(r => r.Checked);

これには、すべてのラジオボタンが直接同じコンテナー(たとえば、パネルまたはフォーム)にある必要があり、コンテナーにはグループが1つしかないことに注意してください。そうでない場合は、List<RadioButton>各グループのコンストラクターでを作成してから、を作成できlist.FirstOrDefault(r => r.Checked)ます。


それはあなたの答えの2番目の段落のs.FirstOrDefault代わりにすべきlist.FirstOrDefaultですか?

@Phoenix:s変数名ではなく、複数形です。
SLaks

すばらしい答えですが、OPの主な質問には実際には答えませんでした。私の答えを見てください。
D'Hag

vb.netの皆さんのために、Telerikコンバーターへの旅行を保存します。DimcheckedButton = radConnections.Controls.OfType(Of RadioButton)()。FirstOrDefault(Function(r)r.Checked)
JoshYates1980

36

すべてのボタンのCheckedEventsを1つのハンドラーに関連付けることができます。そこで、正しいチェックボックスを簡単に取得できます。

// 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;
    }
}

代わりにこれである必要があります-if(((RadioButton)sender).Checked)
Frank Tzanabetis 2013

1
WPFのRadioButtonにはCheckedChangedがありません。どこから取得しましたか?
Murhaf Sousli 2013

26

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;
}

12

OPはチェックされたRadioButton BY GROUPを取得したいと考えていました。@SLaksの回答はすばらしいですが、OPの主な質問には実際には回答しません。@SLaksの回答を改善するには、LINQをさらに一歩進めてください。

これは、私自身の作業コードの例です。通常のWPF Gridに従って、私のRadioButtonは、他のタイプのコントロールの束とともに(「myGrid」という名前の)に含まれています。グリッドに2つの異なるRadioButtonグループがあります。

特定のグループからチェック済みのRadioButtonを取得するには:

List<RadioButton> radioButtons = myGrid.Children.OfType<RadioButton>().ToList();
RadioButton rbTarget = radioButtons
      .Where(r => r.GroupName == "GroupName" && r.IsChecked)
      .Single();

コードにRadioButtonがチェックされない可能性があるSingleOrDefault()場合は、を使用します(トライステートボタンを使用していない場合は、常に1つのボタン「IsChecked」をデフォルトの選択として設定します)。


1
r.GroupName == "GroupName"とr.IsCheckedは異なる型(boolとbool?)であり、bool型のr.IsChecked.Valueを使用する必要がありました。
Mike

1
null可能なブールプロパティである.Where(r => r.GroupName == "GroupName" && r.IsChecked == true)ため、試してくださいr.IsChecked
Firnas

ここでmyGridは何を参照していますか。
Unnikrishnan 2017年

@マイクここで「ラジオボタン」とは何か教えていただけますか?
ベラ・スワン

1
@BellaSwan-コードを見てください-すべてのラジオボタンのリストを作成し、それを変数に割り当てます。次に、同じ変数で、Where選択を実行してrbTargetに割り当てる必要があります。
Mike


1

Extensionメソッドを使用して、RadioButtonのParent.Controlsコレクションを反復できます。これにより、同じスコープ内の他のRadioButtonをクエリできます。2つの拡張メソッドを使用して、最初にグループ内のいずれかのRadioButtonが選択されているかどうかを判別し、次に2番目のメソッドを使用して選択を取得できます。RadioButtonタグフィールドを使用して、グループ内の各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;

1

CheckedChangedEventの配線に加えて、Controlsの "Tag"プロパティを使用してラジオボタンを区別できます...(スパゲッティコード)の代替は、 "TabIndex"プロパティです; P


これは、選択したラジオボタンID(プロパティSystem.Windows.Forms.Control.Tagを使用)でケースの切り替えをすばやく使用できることを意味します。質問への私の追加を理解できない場合は、評価を下げないでください。
Binkan Salaryman

1

このような状況では、Accessが私の選択した毒だったとき、私は私の青春を恋しく思い、グループの各ラジオボタンに独自の値を与えることができました。

C#でのハックは、タグを使用して値を設定することです。グループから選択を行うと、選択したラジオボタンのタグの値を読み取ります。この例では、directionGroupは、「None」と「NE」、「SE」、「NW」、「SW」を他の4つのラジオボタンのタグとして持つ4つの5つのラジオボタンがあるグループです。

1つのイベントハンドラーをすべてのボタンのCHeckCHangedイベントに割り当てると、1つのボタンを変更するとすべてが変更されるため、ボタンを積極的に使用して、チェックされたボタンの値をキャプチャしました。したがって、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());
    }

ちなみに、私はこれをテストして仕事で使用しました。

ジョーイ


「FormatableString」の結果のみを変更して、プログラムでコードを使用することができました。radioButtonタグも知らなかった。これが答えのあるべき姿です。素晴らしいサー。
Unnikrishnan 2017年

0

選択範囲をファイルまたはその他に保存して後で呼び出す場合は、ここで私がやっていること

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;

0

コントロール内の選択したラジオボタンのインデックスを取得する場合は、このメソッドを使用できます。

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ブロックを追加しました、そして今方法はうまくいくようです。


0

WinBoxを使用している場合、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();
     }

0

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.