2011-02-07 20 views
1

有3個複選框項目和一個按鈕的形式。除非在表單上至少檢查了一個以上的項目,否則按鈕'完成'被禁用。C#做,除非ATLEAST超過1項禁用按鈕被選中

private void btnFinish_Validating(object sender, CancelEventArgs e) 
    { 
     if ((checkBlinna.Checked == false && checkSoup.Checked == false) || (checkBlinna.Checked == false && checkGnocchi.Checked == false) || (checkSoup.Checked == false && checkGnocchi.Checked == false)) 
     { 
      btnFinish.Enabled = false; 
     } 
    } 

認爲這將工作,但從一開始啓用按鈕,並且當任何複選框被選中時,該按鈕永遠被禁用。

+0

只是爲了澄清,「至少超過1」或許應該說「兩個或兩個以上。」我在回答和您的評論指出時瞭解了這些細節。 – JYelton 2011-02-07 22:08:03

回答

4

你可以這樣做:

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

呼叫的形式負載內部和驗證處理。

+0

我喜歡Lambda Expression方法。從我+1。 – AbrahamJP 2011-02-07 18:29:26

2

我很困惑你的邏輯。這應該工作,我認爲

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

我建議寫,你可以用它來使一個小的輔助方法/禁用按鈕:

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

你那麼每當你需要啓用調用此方法/禁用按鈕,例如,在複選框的CheckedChanged事件處理程序:

btnFinish.Enabled = AtLeastOneCheck(); 

編輯:根據您的澄清,如果你需要兩個或更多的檢查,你可以修改helper方法如下:

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 2011-02-07 18:55:28

+0

@TheEnd:我會相應地編輯答案。 – JYelton 2011-02-07 19:23:12

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

我支持llia Jerebtsov解決方案一路,但我的做法會有些不同我想補充和CheckboxChanged事件,並擁有所有的複選框連接到相同的事件發生llia代碼的複選框事件中,像這樣:

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

,然後它應該有希望的工作。希望有所幫助。感謝llia雖然:)