2011-08-17 14 views
10

Hay una casilla de verificación en el control datetimepicker de winforms .net. Pero no pude encontrar el evento que se desencadena cuando la casilla de verificación está marcada o desmarcada. ¿Hay una salida?Cómo obtener datetimepicker C# winform marcado/desmarcado evento

+0

Eche un vistazo aquí http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/27dd3141-5dfb-439e-8e30-e051a019303a/ – V4Vendetta

Respuesta

2

se le realizarán para almacenar el viejo "marcada" valor con el fin de comparar a la nueva, por lo que vas a poder determinar si el "marcado" el estado ha cambiado:

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

Sin embargo, sí desencadenar el evento valor cambiado

+2

A menos que la propiedad Comprobada esté configurada en el código. –

2

Se produce el mismo problema. Necesitaba un evento CheckedChangedEvent en un control de DateTimePicker winforms. Entonces, con la inspiración de las respuestas que tenía ante mí, creé un Control de usuario heredado llamado DateTimePicker2, heredando de DateTimePicker que implementa este evento. Parece que funciona, pero no hay garantías.

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

} 

Y fuera de curso no se olvide de suscribirse al evento DateTimePicker2_ValueChanged del diseñador.

La razón por la que he usado tanto una nueva propiedad Checked (para ocultar el base.Checked uno) y un campo para mantener _checked camión del valor anterior, se debe a

  1. la propiedad base.Checked no lo hace desencadenar el evento ValueChanged cuando se modificó mediante programación y, por lo tanto, necesitaba una nueva propiedad que pudiera hacer eso.
  2. esto. La propiedad comprobada nueva no desencadena el evento ValueChanged cuando se cambió de la UI y, por lo tanto, necesitaba un indicador que rastreara la propiedad base.Checked.

Básicamente se necesitaba una combinación de ambos enfoques.

Espero que esto ayude.

+0

Buena y simple solución. Para hacerlo de acuerdo con la moda 2017, use 'event EventHandler ' en lugar de delegar. Para subir el evento use 'this.CheckedChanged? .Invoke (this, e)' Además, suscríbase al 'ValueChanged' en el constructor:' this.ValueChanged + = DateTimePicker_ValueChanged'. De esta manera, está seguro de que nadie puede evitar que esta clase funcione correctamente. El nuevo Checked se llama para cambios programáticos, el evento ValueChanged se genera durante los cambios realizados por el operador. –

0

Sé que esto es muy viejo, pero esto podría ayudar a alguien.

Puede capturar DataTimePicker.MouseUp caso

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

Usted tendrá que hacer lo mismo con KeyUp evento con el fin de conseguir la prensa tecla de espacio que también podrían activar la casilla de verificación.

Cuestiones relacionadas