2013-03-04 66 views
3

有沒有任何方法或是否有可能編寫一個方法來執行一組指令時,(Windows窗體)複選框未選中(但未選中時)?我將澄清這提供我的示例代碼。「checked = false」的複選框(事件)方法

現有的示例代碼:

private void ChkBox_CheckedChanged(object sender, EventArgs e) 
{ 
    if (ChkBox.Checked == false) 
     { 
       MessageBox.Show("unchecked"); 
     } 
} 

問:莫非if condition通過寫這得到執行,只有當複選框取消選中此方法來避免。

插圖: 事情是這樣的:

private void ChkBox_Unchecked(object sender, EventArgs e) 
{ 
    MessageBox.Show("unchecked"); 
} 

補充意見:我沒有什麼要對事件「複選框被選中」執行。所以就在想,如果我能避免checkchanged通過將其替換爲unchecked事件類型。

+1

winforms,wpf,asp.net? – 2013-03-04 11:37:29

+5

沒有這樣的事情,因爲它沒用。 – 2013-03-04 11:38:07

+0

@lazyberezovsky,windows forms – Enthusiastic 2013-03-04 12:03:45

回答

5

如果你真的很需要那奇怪的事件,然後通過繼承創建自定義複選框複選框。覆蓋它的OnCheckedChanged事件,並添加您Unchecked事件:

public class StrageCheckBox : CheckBox 
{ 
    public event EventHandler Unchecked; 

    protected override void OnCheckedChanged(EventArgs e) 
    { 
     base.OnCheckedChanged(e); 

     if (!Checked) 
      OnUnchecked(e); 
    } 

    protected virtual void OnUnchecked(EventArgs e) 
    { 
     if (Unchecked != null) 
      Unchecked(this, e); 
    } 
} 

使用StrangeCheckBoxes,而不是默認的複選框。訂閱Unchecked事件。瞧,你有這種奇怪的行爲。

備註其實我不會建議在所有情況下使用自定義控件或if/else。如果你有這種行爲的複選框很多,那麼自定義控件比每個處理程序中許多重複的if/else更好。如果你有幾個控件,或者所有複選框的單處理器,那麼我會採用if/else方法。

+0

沒有downvote(上面實際提倡),但'羨慕'?似乎......放肆而審慎。 – 2013-03-04 11:46:24

+0

@GrantThomas這就是我稱之爲downvoters,不留下評論和downvote工作答案。我看到的這種行爲的唯一原因是嫉妒。不是嗎? :) – 2013-03-04 11:47:42

+2

同意!如果不是現在..可以用於未來的參考..方便的代碼..感謝分享.. – 2013-03-04 12:26:25

1

沒有,暴露的唯一事件是一個檢測更改狀態時發生,那麼你必須檢查狀態,以確定它是如何改變。

你可以,如果這樣的傾向,創建你自己的控制基本上包裝這一個,暴露出這樣的狀態可區別的事件,但這似乎完全沒有意義的。

+0

謝謝..是的,如果還有其他更好的比那種複雜的方法! – Enthusiastic 2013-03-04 12:08:07

0

據我所知,該事件上的所有更改被炒了,你可以編寫自己的控制,區分選擇的價值,並提出獨立的事件,但不知道它是真的值得的。

1

對不起,先生。這是您可以觸發狀態更改的唯一事件。你的代碼看起來很好。 你不喜歡它的任何理由?

0

我不認爲你可以這樣做,但是如果你有很多指令可以執行,如果複選框沒有被選中,並且你不想將它們封裝在if聲明中,你可以在開始時檢查checked並返回:

private void ChkBox_CheckedChanged(object sender, EventArgs e) 
{ 
    if (ChkBox.Checked) return; 

    MessageBox.Show("unchecked"); 
} 
+4

個人而言,我從來不明白爲什麼人們在比較中使用「'== true」「。 – 2013-03-04 11:41:30

+1

現在更好:)。我只是複製粘貼代碼並用「true」代替「false」。 – niculare 2013-03-04 11:43:15

2

您可以繼承CheckBoxoverride OnCheckedChanged

class ExtendedCheckBox : CheckBox 
{ 
    public event EventHandler Unchecked; 
    protected override void OnCheckedChanged(EventArgs e) 
    { 
     base.OnCheckedChanged(e); 

     if (Checked == false) 
      OnUnchecked(e);    
    } 
} 
+0

這似乎是最糟糕的做法;正如我所建議的那樣,您可以公開兩個_new_事件來區分狀態並相應地在'CheckedChanged'上觸發它們,而不會實質性地吞噬錯誤狀態警報。 – 2013-03-04 11:42:42

+0

@GrantThomas - 你能更具體一點嗎? – 2013-03-04 11:43:58

+0

+1對於涵蓋原始問題的內容,但對於場景來說似乎過分了。如果一個bool比較的性能如此之緊以至於有所作爲,則OP可能必須與虛擬方法調用進行速度比較! – JRoughan 2013-03-04 11:44:11

0

這將是一個簡單直接的解決方案,儘管最好的建議方法是從CheckBox繼承並修改事件。但是,一個相對簡單的方法如下:

減小CheckBox寬度,以便CheckBox Label不再可見。只有箱子應該可見。然後,在盒子旁邊應該包含另一個標籤,這個標籤應該與盒子互斥。

現在編輯CheckBox Clicked事件。使用某種標誌來標識複選框的狀態。瞧!

相關問題