2011-02-07 3 views
1

확인란 항목이 세 개인 양식과 단추가 있습니다. 양식에 최소한 1 개 이상의 항목이 표시되어 있지 않으면 '마침'버튼을 비활성화 상태로 유지하십시오.C# 적어도 하나 이상의 항목을 검사하지 않는 한 단추를 비활성화합니다.

버튼이 처음부터 활성화되었지만 확인란이 선택되어 있으면 버튼이 계속 비활성화됩니다.

+0

"적어도 둘 이상"은 아마도 "둘 이상"이라고 말해야합니다. 나는 대답과 당신의 의견이 그것을 지적했을 때이 세부 사항을 알게되었습니다. – JYelton

답변

4

당신은 할 수 있습니다 :

void UpdateFinishEnabled() 
{ 
    var boxes = new CheckBox[] { checkBlinna, checkSoup, checkGnocchi }; 
    btnFinish.Enabled = boxes.Any(b => b.Checked); 
} 

양식로드 내부 전화하고 확인하는 핸들러를.

+0

나는 Lambda Expression 접근법을 좋아했습니다. +1. – AbrahamJP

2

나는 당신의 논리와 혼동합니다. 활성화해야 할 때마다 당신은이 메소드를 호출

private bool AtLeastOneCheck() 
{ 
    return (checkBlinna.Checked || checkSoup.Checked || checkGnocchi.Checked); 
} 

/을 비활성화 : 이것은 내가 활성화하는 데 사용할 수있는 작은 도우미 메서드를 작성하는 것이 좋습니다

bthFinish.Enabled = checkBlinna.Checked || checkSoup.Checked || checkGnocchi.Checked; 
0

생각 작동합니다/버튼을 비활성화 버튼, 예를 들어, 체크 박스의 CheckedChanged 이벤트 핸들러 :

btnFinish.Enabled = AtLeastOneCheck(); 

편집 : 귀하의 해명 당, 경우

private int CountChecked() 
{ 
    CheckBox[] AllCheckboxes = { checkBlinna, checkSoup, checkGnocchi }; 
    return AllCheckboxes.Count(cb => cb.Checked); 
} 

을 약간 다르게 구현 : 두 개 이상의 확인은 다음과 같이 당신이 도우미 메서드를 수정할 수 있습니다 요구하는 문제가, 유효성 검사 이벤트가 윌의

btnFinish.Enabled = CountChecked() >= 2; 
+0

감사. 이것이 내 상황에 더 적합한 것입니다 : "적어도 1 개 이상" 개인 부울 AtLeastOneCheck() { 리턴 (checkBlinna.Checked && checkSoup.Checked || checkBlinna.Checked && checkGnocchi.Checked || checkSoup.Checked && checkGnocchi.Checked); } – TheEnd

+0

@ TheEnd : 이에 따라 답변을 수정하겠습니다. – JYelton

0
private void btnFinish_Validating(object sender, CancelEventArgs e) 
{ 

    btnFinish.Enabled = checkBlinna.Checked || checkSoup.Checked || checkGnocchi.Checked; 

} 
2
private void btnFinish_Validating(...) 

btnFinish가 포커스를 잃을 때만 발생합니다. 확인란이 변경 상태를 제어 할 때이 코드가 실행되어야하므로 적절하지 않습니다. 더 나쁜 것은 결코이 발생합니다. 초점이 맞지 않으므로 버튼이 비활성화되어있을 때입니다. 그래서 당신은 그것을 작동하게 만들 수 없었습니다. 이라는 코드가 있어야합니다. 체크 상자 컨트롤의 CheckedChanged 이벤트 처리기 중 모두입니다.

대체 방법으로 Application.Idle 이벤트에서 이러한 종류의 상태 업데이트 메서드를 실행할 수도 있습니다. 이벤트 처리 코드 묶음을 작성하지 않아도됩니다. 그러나 불필요한 작업을 수행하는 대신에. 다른 일을 할 필요가 없을 때 싸고 뛰기 때문에 중요하지 않습니다.

public Form1() { 
     InitializeComponent(); 
     Application.Idle += new EventHandler(Application_Idle); 
    } 

    void Application_Idle(object sender, EventArgs e) { 
     bthFinish.Enabled = checkBlinna.Checked || checkSoup.Checked || checkGnocchi.Checked; 
    } 
+0

이것은 재미있어 보입니다. 나는 다음 프로젝트를 위해이 아이디어를 고려할 것이다. – TheEnd

0

나는, 그러나 나의 접근 방식은 내가 추가하고 CheckboxChanged 이벤트를하고과 같이 체크 박스 이벤트 내에서 동일한 이벤트 장소 llia 코드에 연결된 모든 확인란을 것이다 약간 다른 것 Jerebtsov 솔루션 llia 모든 방법을 지원합니다

private void CheckChanged(object sender, EventArgs e) 
{ 
    var boxes = new CheckBox[] { checkBlinna, checkSoup, checkGnocchi }; 
    btnFinish.Enabled = boxes.Any(b => b.Checked); 
} 

그리고 희망적으로 작동해야합니다. 도움이 된 희망. llia에 대한 크레딧 :

관련 문제