В элементе управления ditetimepicker для winforms.net установлен флажок. Но я не мог найти событие, которое запускается, когда флажок установлен или снят. Есть ли выход?
Как получить datetimepicker С# winform checked/unchecked event
Ответ 1
Вам нужно сохранить старое "проверенное" значение, чтобы сравнить его с новым, так что вы сможете определить, изменилось ли состояние "checked":
bool oldDateChecked = false; //if it 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
Однако он запускает событие с измененным значением
Ответ 3
Запустите ту же проблему. Мне нужен CheckedChangedEvent для элемента управления DateTimePicker winforms. Таким образом, с учетом моих ответов я создал унаследованный User Control с именем 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, чтобы сохранить грузовик старого значения, заключается в том, что
- свойство base.Checked не запускает событие ValueChanged при программном изменении и поэтому нуждается в новом свойстве, которое могло бы это сделать.
- this.Checked new property не запускает событие ValueChanged при изменении его из пользовательского интерфейса и поэтому ему нужен флаг, который будет отслеживать свойство base.Checked.
В принципе, было необходимо сочетание обоих подходов.
Надеюсь, это поможет.
Ответ 4
Я знаю, что это супер старый, но это может помочь кому-то.
Вы можете записать событие 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
, чтобы нажать клавишу пробела, которая также может активировать этот флажок.