2

我有三个DateTimePicker,其中之一是 startdate 和 enddate 之间的间隔。在部分代码中,我更新了startdate.Valueand enddate.Value,其ValueChanged事件更新了interval.Value

日期时间选择器

interval当不需要手动更改in 的值时,一切正常。但是当我需要手动更改它时,它会导致StackOverflow异常,因为final.Value设置时,它会导致ValueChanged触发间隔的事件,从而改变final.Value,等等。

这是startdateand的 ValueChanged 处理程序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;
        }
    }

这是interval导致StackOverflow异常的 ValueChanged 处理程序:

    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);
    }

有没有办法更改此代码并使其按我需要的方式工作?

4

2 回答 2

3

确保始终存在退出条件:

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

这样,如果没有更改,事件将不会触发。

更新:更改了代码,以便将秒数添加到 startDP,而不是 finalDP。

于 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 回答