2

I have the three DateTimePicker, where one of them is the interval between startdate and enddate. In a part of the code, I update startdate.Value and enddate.Value, whose ValueChanged events update interval.Value.

DateTimePickers

Everything works fine when the value in interval doesn't need to be changed manually. But when I need to change it manually, it causes a StackOverflow exception, because when final.Value is set, it causes interval's ValueChanged event to trigger, which changes final.Value, and so on.

This the ValueChanged handler for startdate and enddate:

    private void dates_ValueChanged(object sender, EventArgs e)
    {
        if (startdate.Value < enddate.Value)
        {
            TimeSpan diff = enddate.Value - startdate.Value;
            DateTime newInterval = new DateTime(startdate.Value.Year, startdate.Value.Month, startdate.Value.Day, diff.Hours, diff.Minutes, diff.Seconds);
            if (interval.Value != newInterval)
                interval.Value = newInterval;
        }
    }

And this is the ValueChanged handler for interval, which causes the StackOverflow exception:

    private void interval_ValueChanged(object sender, EventArgs e)
    {
        int seconds = intervaloDP.Value.Hour * 3600 + intervaloDP.Value.Minute * 60 + intervaloDP.Value.Second;
        finalDP.Value = finalDP.Value.AddSeconds(seconds);
    }

Is there a way to change this code and make it work the way I need it to work?

4

2 に答える 2

3

常に終了条件があることを確認してください。

var dtm = startDP.Value.AddSeconds(seconds);
if (dtm != finalDP.Value)
    finalDP.Value = dtm;

このように、変更する必要がない場合、イベントは発生しません。

更新:秒が finalDP ではなく startDP に追加されるようにコードを変更しました。

于 2013-04-26T14:30:42.187 に答える
0

実際、必要な場合にのみ間隔を更新することで、すでに正しいことを行っています。

   if (interval.Value != newInterval)  interval.Value = newInterval;

更新の無限ループを回避するには、これで十分です。しかし、あなたは他の更新を間違って計算しています:

 private void interval_ValueChanged(object sender, EventArgs e)
    {
        int seconds = intervaloDP.Value.Hour * 3600 + intervaloDP.Value.Minute * 60 + intervaloDP.Value.Second;
        // finalDP.Value = finalDP.Value.AddSeconds(seconds); //wrong
        finalDP.Value = startDP.Value.AddSeconds(seconds); 
    }

(ところで、間隔がポイントを横切ったときの望ましい動作を定義する必要があります24:00:00

于 2013-04-26T14:51:15.463 に答える