如何获取datetimepicker c#winform选中/未选中的事件

时间:2011-08-17 08:56:14

标签: c# winforms events datetimepicker

winforms .net的datetimepicker控件中有一个复选框。 但是,当选中或取消选中复选框时,我找不到触发的事件。 有出路吗?

4 个答案:

答案 0 :(得分:13)

但它会触发值更改事件

答案 1 :(得分:2)

您必须存储旧的“已检查”值才能与新值进行比较,因此您可以确定“已检查”状态是否已更改:

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

    }
}

答案 2 :(得分: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 new属性在从UI更改时不会触发ValueChanged事件,因此需要一个标记来跟踪base.Checked属性。
  3. 基本上需要两种方法的组合。

    我希望这会有所帮助。

答案 3 :(得分: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事件执行相同的操作,以便按下也可以激活复选框的Space键。