1

我试图在 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 中找到先前的值(它是 null :( )。希望我清楚我想要实现的目标。如果你问我的原因需要这个,这是无关紧要的,我不能编辑其他代码,只有这个方法。

4

2 回答 2

2

顾名思义,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;
        }
    }
}

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

于 2012-10-05T07:40:47.507 回答
0

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


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


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

private DateTime oldValue = SomeDateTimePicker.Value;

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

    this.oldValue = SomeDateTimePicker.Value
}
于 2012-10-05T07:40:58.317 回答