在ValueChanged事件中获取对象的先前值

时间:2012-10-05 07:33:40

标签: c# winforms event-handling datetimepicker valuechangelistener

我试图在遇到事件ValueChanged时获取DateTimePicker的先前值。我的问题的另一个可能的解决方案是获取用户是否单击某个值并选择它或者是否通过某种方法调用它。我的问题是我需要知道导致此事件的原因并且仅在前一个值不同时执行一些代码。我已阅读this并且不喜欢可能的方式#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 :()。希望我很清楚我想要实现的目标。如果你要求我需要这个的原因,它是无关紧要的,我不能编辑其他代码,只是这个方法。

2 个答案:

答案 0 :(得分:1)

NameChanged-Event,顾名思义,只有在DateTimePicker的Value发生变化时才会触发。 您无需检查代码中的值是否已更改。

您声明EventArgs为null,但在未经修改的框架中使用时,它应为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;
        }
    }
}

编辑我已更改了我的示例,以满足您检查程序化更改的要求,如评论中所述。

答案 1 :(得分:0)

在值更改后,ValueChanged事件在验证后触发。在此事件发生更改之前,您无法获取该值。


如果您想扩展控件的验证,那么您可以使用Validating事件。


如果您只想在更改后触发某些代码,那么您可以编写代码来存储以前的值,就像这样。

private DateTime oldValue = SomeDateTimePicker.Value;

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

    this.oldValue = SomeDateTimePicker.Value
}