如何获取C# Winform中DateTimePicker的选中/取消选中事件

19

在 WinForms .NET 的 DateTimePicker 控件中有一个复选框。 但是我找不到当选中或取消选中该复选框时所触发的事件。 有什么办法吗?


请看这里:http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/27dd3141-5dfb-439e-8e30-e051a019303a/ - V4Vendetta
4个回答

16

但是它会触发值改变事件。


6

为了比较新的“checked”状态是否更改,您需要存储旧的“checked”值:

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

    }
}

3

遇到了同样的问题。我需要在winforms DateTimePicker控件上添加一个CheckedChangedEvent事件。所以,在之前的答案启发下,我创建了一个继承自DateTimePicker的自定义控件DateTimePicker2,并实现了这个事件。看起来它能够工作,但不能保证。

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属性(隐藏了基础的Checked属性)和一个_checked字段来跟踪旧值,是因为:

  1. 基础的Checked属性在编程方式下更改时不会触发ValueChanged事件,因此需要一个新的属性来实现这一点。
  2. 当从UI更改时,this.Checked新属性不会触发ValueChanged事件,因此需要一个标志来跟踪基础的Checked属性。

基本上需要结合两种方法。

希望这可以帮助你。


3
一个好而简单的解决方案。为了符合2017年的潮流,请使用event EventHandler<CheckedChangedEventArgs>代替委托。要引发事件,请使用this.CheckedChanged?.Invoke(this, e)。此外,在构造函数中订阅ValueChanged事件:this.ValueChanged += DateTimePicker_ValueChanged。这样,您可以确保没有人会阻止该类正常运行。新的Checked用于程序更改,ValueChanged事件在操作员进行更改时触发。 - Harald Coppoolse

1
我知道这很老了,但这可能会对某些人有帮助。
你可以捕获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 事件进行同样的操作,以便获取可以激活复选框的空格键按下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接