2011-08-17 70 views

回答

2

You'll有存儲舊「檢查」,以比較新的一個值,所以you'll能夠確定「選中」狀態已更改:

bool oldDateChecked = false; //if it's created as not checked 

private void dtp_filtro_date_ValueChanged(object sender, EventArgs e) 
{ 
    if (this.dtp_filtro_date.Checked != oldDateChecked) 
    { 
     oldDateChecked = this.dtp_filtro_date.Checked; 
     //do your stuff ... 

    } 
} 
10

但它確實觸發值更改事件

+2

除非在代碼中設置了Checked屬性。 –

2

遇到同樣的問題。我需要Winforms DateTimePicker控件上的CheckedChangedEvent。因此,以我之前的答案爲靈感,我創建了一個名爲DateTimePicker2的繼承的用戶控件,該控件繼承自實現此事件的DateTimePicker。它看起來像它的作品,但沒有保證。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace MyNameSpace 
{ 
    public partial class DateTimePicker2 : DateTimePicker 
    { 
     private bool _checked; 

     public new bool Checked 
     { 
      get 
      { 
       return base.Checked; 
      } 
      set 
      { 
       if (value != base.Checked) 
       { 
        base.Checked = value; 
        _checked = base.Checked; 
        OnCheckedChanged(new CheckedChangedEventArgs { OldCheckedValue = !value, NewCheckedValue = value }); 
       } 
      } 
     } 

     public event CheckedChangedEventHandler CheckedChanged; 

     public DateTimePicker2() 
     { 
      InitializeComponent(); 
      _checked = Checked; 
     } 


     protected virtual void OnCheckedChanged(CheckedChangedEventArgs e) 
     { 
      if (CheckedChanged != null) CheckedChanged(this, e); 
     } 

     private void DateTimePicker2_ValueChanged(object sender, EventArgs e) 
     { 
      if (Checked != _checked) 
      { 
       _checked = Checked; 
       CheckedChangedEventArgs cce = new CheckedChangedEventArgs { OldCheckedValue = !_checked, NewCheckedValue = _checked }; 
       OnCheckedChanged(cce); 
      } 
     } 
    } 

    public delegate void CheckedChangedEventHandler(object sender, CheckedChangedEventArgs e); 

    public class CheckedChangedEventArgs : EventArgs 
    { 
     public bool OldCheckedValue { get; set; } 
     public bool NewCheckedValue { get; set; } 
    } 

} 

另外,不要忘了訂閱設計器的DateTimePicker2_ValueChanged事件。

爲什麼我用這兩個新的Checked屬性(隱藏base.Checked之一)和_checked場保留舊值的卡車究其原因,是因爲

  1. 的base.Checked屬性不以編程方式更改時觸發ValueChanged事件,因此需要一個可以實現此目的的新屬性。
  2. this.Checked新屬性在從UI更改時不觸發ValueChanged事件,因此需要一個將跟蹤base.Checked屬性的標誌。

基本上需要兩種方法的組合。

我希望這會有所幫助。

+0

好的和簡單的解決方案。要按照時尚2017年製作,請使用'EventHandler '而不是委託。爲了引發事件,使用'this.CheckedChanged?.Invoke(this,e)'此外,在構造函數中訂閱'ValueChanged':'this.ValueChanged + = DateTimePicker_ValueChanged'。這樣你就可以確定沒有人能阻止這個班級正常運轉。新的Checked被調用進行編程式更改,ValueChanged事件在操作員進行更改期間引發。 –

0

我知道這是超舊的,但這可以幫助某人。

您可以捕捉DataTimePicker.MouseUp事件

private void dateTimePicker1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (((DateTimePicker)sender).Checked) 
     { 
      //Do whatever you need to do when the check box gets clicked 
     } 
     else 
     { 
      //Do another stuff... 
     } 
    } 

您需要,以獲得太空按鍵也能激活該複選框,做同樣的KeyUp事件。

相關問題