我正在尝试获取DateTimePicker的先前值,当它命中事件ValueChanged时。解决我的问题的另一个可能的解决方案是获取用户是否单击了一个值并选择了它,或者它是由某种方法调用的。我的问题是我需要知道导致此事件的原因,并且仅在以前的值不同时才执行一些代码。我已经阅读了这篇文章,并且不喜欢可能的方式#2的解决方案。
所以再说一遍:
if user clicks
{
execute some code
}
else // if method was invoked
{
do NOT execute
}
OR
if value is NOT the same as previously
{
execute some code
}
else
{
do NOT execute
}
这两种方法都适合我,但我无法在可用属性列表中或 EventArgs 中找到以前的值(:(为空)。希望我清楚我想要实现的目标。如果你问我需要这个的原因,这是无关紧要的,我不能编辑其他代码,只能编辑这个方法。
ValueChanged-Event,顾名思义,只有在 DateTimePicker 的值更改时才会触发。您不必检查代码中的值是否已更改。
您声明 EventArgs为空,但在未修改的框架中使用时,它应该是 EventArgs.Empty。
如果要对 LastValue 执行其他操作,可以使用自定义的 DateTimePicker,如下所示。
public class LastDateTimePicker : DateTimePicker {
protected override void OnValueChanged(EventArgs eventargs) {
base.OnValueChanged(eventargs);
LastValue = Value;
IsProgrammaticChange = false;
}
public DateTime? LastValue { get; private set; }
public bool IsProgrammaticChange { get; private set; }
public new DateTime Value {
get { return base.Value; }
set {
IsProgrammaticChange = true;
base.Value = value;
}
}
}
编辑 我已经更改了我的示例以满足您检查编程更改的要求,如您的评论中所述。
ValueChanged
事件在验证后,在值更改后触发。无法在更改此事件之前获取值。
如果要扩展控件的验证,则可以使用 Validating
事件。
如果您只想在更改后触发一些代码,则可以编写代码来存储以前的值,如下所示。
private DateTime oldValue = SomeDateTimePicker.Value;
private SomeDateTimePickerValueChanged(object sender, EventArgs e)
{
if (SomeDateTimePicker.Value != oldValue)
{
//Do Something
}
this.oldValue = SomeDateTimePicker.Value
}