2011-08-17 5 views

risposta

2

avrete modo devono conservare il vecchio "controllato" valore al fine di confrontare a quello nuovo, quindi avrete modo essere in grado di determinare se il "controllato" stato modificato:

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

Ha, tuttavia innescare il valore cambiato evento

+2

A meno che la proprietà selezionata sia impostata nel codice. –

2

Eseguire lo stesso problema. Avevo bisogno di un CheckedChangedEvent su un controllo DateTimePicker di winforms. Quindi, con l'ispirazione delle risposte precedenti, ho creato un controllo utente ereditato denominato DateTimePicker2, che eredita da DateTimePicker che implementa questo evento. Sembra che funzioni, ma non ci sono garanzie.

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; } 
    } 

} 

E fuori rotta non dimenticare di sottoscrivere l'evento DateTimePicker2_ValueChanged dal progettista.

Il motivo per cui ho usato sia una nuova proprietà Checked (per nascondere la base.Checked uno) e un campo _checked per mantenere camion del vecchio valore, è perché

  1. la proprietà base.Checked non lo fa lanciare l'evento ValueChanged quando viene modificato a livello di codice e quindi ha bisogno di una nuova proprietà che possa farlo.
  2. la nuova proprietà this.Checked non attiva l'evento ValueChanged quando viene modificata dall'interfaccia utente e pertanto ha bisogno di un flag per tenere traccia della proprietà base.Checked.

Fondamentalmente era necessaria una combinazione di entrambi gli approcci.

Spero che questo aiuti.

+0

Soluzione buona e semplice. Per renderlo conforme alla moda 2017, utilizzare 'event EventHandler ' invece di delegare. Per aumentare l'evento usa 'this.CheckedChanged? .Invoke (this, e)' Inoltre, sottoscrivi il 'ValueChanged' nel costruttore:' this.ValueChanged + = DateTimePicker_ValueChanged'. In questo modo sei sicuro che nessuno può impedire a questa classe di funzionare correttamente. Il nuovo Checked viene chiamato per le modifiche programmatiche, l'evento ValueChanged viene generato durante le modifiche apportate dall'operatore. –

0

So che questo è super vecchio ma questo potrebbe aiutare qualcuno.

È possibile catturare DataTimePicker.MouseUp evento

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... 
     } 
    } 

Sarà necessario fare lo stesso con KeyUp evento al fine di ottenere la pressione di un tasto spazio che potrebbe attivare anche la casella di controllo.