1

イベント ValueChanged にヒットしたときに、DateTimePicker の以前の値を取得しようとしています。私の問題に対する他の可能な解決策は、ユーザーが値をクリックして選択したか、それとも何らかの方法で呼び出されたかを取得することです。私の問題は、このイベントの原因を知り、前の値が異なる場合にのみコードを実行する必要があることです。私はこれを読みましたが、可能な方法#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 が 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;
        }
    }
}

編集コメントに記載されているように、プログラムの変更を確認するという要件を満たすように例を変更しました。

于 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 に答える