그룹에서 어떤 라디오 버튼이 선택되어 있습니까?


118

WinForms 사용; 그룹에 대해 확인 된 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 컨트롤을 반복하고 이전에 확인한 항목의 선택을 취소합니다.
João Angelo

1
WinForms 또는 ASP.Net을 사용하고 있습니까?
SLaks

답변:


219

LINQ를 사용할 수 있습니다.

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

이를 위해서는 모든 라디오 버튼이 동일한 컨테이너 (예 : Panel 또는 Form)에 직접 있어야하며 컨테이너에는 그룹이 하나만 있어야합니다. 그렇지 않은 경우 List<RadioButton>각 그룹의 생성자에서 s를 만든 다음 list.FirstOrDefault(r => r.Checked).


대답의 두 번째 단락 s.FirstOrDefault대신에 있어야합니까 list.FirstOrDefault?

@Phoenix : s변수 이름이 아니라 복수형입니다.
SLaks 2011 년

훌륭한 대답이지만 실제로 OP의 주요 질문에는 대답하지 않았습니다. 내 대답을 참조하십시오.
D' Hag

vb.net 여러분을 위해 Telerik 변환기에 대한 여행을 저장하겠습니다. Dim checkedButton = radConnections.Controls.OfType (Of RadioButton) (). FirstOrDefault (Function (r) r.Checked)
JoshYates1980

36

하나의 핸들러에 대해 모든 버튼 의 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;
    }
}

대신이 값이어야합니다-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에 따라, 내 RadioButtons는 Grid다른 유형의 컨트롤과 함께 ( "myGrid"라고 함)에 포함됩니다. Grid에 두 개의 다른 RadioButton 그룹이 있습니다.

특정 그룹에서 확인 된 RadioButton을 가져 오려면 :

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

코드에 RadioButtons가 검사되지 않을 가능성이있는 SingleOrDefault()경우 사용합니다 (삼중 상태 버튼을 사용하지 않는 경우 항상 하나의 버튼 "IsChecked"를 기본 선택으로 설정합니다.)


1
r.GroupName == "GroupName"및 r.IsChecked는 서로 다른 유형 (bool 및 bool?)이므로 bool 유형 인 r.IsChecked.Value를 사용해야합니다.
Mike

1
nullable bool 속성 .Where(r => r.GroupName == "GroupName" && r.IsChecked == true)이므로 시도하십시오 r.IsChecked.
Firnas

여기서 myGrid는 무엇을 참조합니까?
Unnikrishnan 2017-06-22

@Mike 여기서 "radioButtons"가 무엇인지 말씀해 주시겠습니까?
Bella Swan

1
@BellaSwan-코드 살펴보기-모든 라디오 버튼 목록을 만들고 변수에 할당합니다. 그런 다음 동일한 변수에서 Where 선택을 실행하고 rbTarget에 할당해야합니다.
Mike


1

Extension 메서드를 사용하여 RadioButton의 Parent.Controls 컬렉션을 반복 할 수 있습니다. 이를 통해 동일한 범위에있는 다른 RadioButton을 쿼리 할 수 ​​있습니다. 두 가지 확장 방법을 사용하면 첫 번째 방법을 사용하여 그룹의 RadioButton이 선택되었는지 여부를 확인한 다음 두 번째 방법을 사용하여 선택을 가져올 수 있습니다. 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 개의 라디오 버튼이있는 그룹입니다.

하나의 이벤트 핸들러를 모든 버튼의 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());
    }

참고로, 나는 이것을 내 작업에서 테스트하고 사용했습니다.

조이


'FormatableString'결과 만 수정하여 프로그램에서 코드를 사용할 수있었습니다. 나는 또한 radioButton Tag를 몰랐다. 이것이 답이되어야하는 방법입니다. 위대한 각하.
Unnikrishnan 2017-06-22

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

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

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.