C# 在ValueChanged事件中获取对象的上一个值

C# 在ValueChanged事件中获取对象的上一个值,c#,winforms,event-handling,datetimepicker,valuechangelistener,C#,Winforms,Event Handling,Datetimepicker,Valuechangelistener,我试图在DateTimePicker命中事件值Changed时获取它的上一个值。我的问题的另一个可能的解决方案是获取用户是单击某个值并选择它,还是由某个方法调用它。我的问题是我需要知道是什么导致了这个事件,并且只有在前面的值不同的情况下才执行一些代码。我读过,不喜欢可能的解决方法2 所以再次强调: if user clicks { execute some code } else // if method was invoked { do NOT execute } OR i

我试图在DateTimePicker命中事件值Changed时获取它的上一个值。我的问题的另一个可能的解决方案是获取用户是单击某个值并选择它,还是由某个方法调用它。我的问题是我需要知道是什么导致了这个事件,并且只有在前面的值不同的情况下才执行一些代码。我读过,不喜欢可能的解决方法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中找到上一个值(该值为null:()。希望我清楚地知道我想要实现什么。如果你问我需要它的原因,它是不相关的,我不能编辑其他代码,只有这个方法。

ValueChanged事件,顾名思义,只有当DateTimePicker的值更改时才会触发。 您不必检查代码中的值是否已更改

您声明EventArgs为null,但在未修改的框架中使用时,它应为EventArgs.Empty

如果您想使用LastValue执行其他操作,可以使用这样的自定义日期时间选择器

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;
        }
    }
}
private DateTime oldValue = SomeDateTimePicker.Value;

private SomeDateTimePickerValueChanged(object sender, EventArgs e)
{
    if (SomeDateTimePicker.Value != oldValue)
    {
        //Do Something
    }

    this.oldValue = SomeDateTimePicker.Value
}
编辑如您的评论所述,我已更改了我的示例以满足您检查程序更改的要求。

该事件在值更改后在验证后触发。您无法从该事件中获取更改前的值


如果要扩展控件的验证,则可以使用事件


如果您只是想在更改后触发一些代码,那么您可以编写代码来存储以前的值,类似这样的事情

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;
        }
    }
}
private DateTime oldValue = SomeDateTimePicker.Value;

private SomeDateTimePickerValueChanged(object sender, EventArgs e)
{
    if (SomeDateTimePicker.Value != oldValue)
    {
        //Do Something
    }

    this.oldValue = SomeDateTimePicker.Value
}

没错。它是空的:)但不管怎样,这没有帮助:(然后,您必须重新指定您的问题。您希望在处理ValueChanged之前检查值是否确实更改,但在激发ValueChanged之前,DateTimePicker已经完成了此检查。也许我只是使用了错误的方法?一旦用户选择了日期并且它是有效的输入,我想检查它是否确实更改已更改,或者是用户更改了,而不是其他方法。然后,您必须以其他方式设置编程更改。我已编辑了我的示例,以便它满足您的要求。在“值更改”中,您可以检查IsProgrammaticChange是否为真。