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