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

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



답변

LINQ를 사용할 수 있습니다.

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

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


답변

하나의 핸들러에 대해 모든 버튼 의 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에 따라, 내 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”를 기본 선택으로 설정합니다.)


답변

모든 RadioButton에 CheckedChanged 이벤트를 사용할 수 있습니다 . Sender체크되지 않고 체크 된 RadioButton이됩니다.


답변

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;


답변

CheckedChangedEvent 연결 외에도 Controls “Tag”속성을 사용하여 라디오 버튼을 구분할 수 있습니다. (스파게티 코드) 대안은 “TabIndex”속성입니다.; P