我有一个文本框,它进行数学计算,我不希望它处理小数点,所以我使用int作为类型,我添加一个错误捕获异常,显示一个消息框。我希望消息框上有一个延迟计时器,这样人们就可以有时间在使用MouseMove事件进行计算时更改值。
catch (FormatException fEX)
{
Message.Box("Value must be a divisisable by 1 exactly")
不,我不想使用像
这样的东西(x%1)== 0只想在上面的消息框中设置延迟计时器
答案 0 :(得分:1)
我同意@ CodeCaster的评论,即消息框不是向用户传达无效输入的最佳方式,但以下是如何做到的:
//declare DateTime lastErrMsg = DateTime.MinValue; at your class level
catch (FormatException fEX)
{
if (DateTime.Now - lastErrMsg > TimeSpan.FromSeconds(30)) //or whatever TimeSpan value
{
Message.Box("Value must be a divisisable by 1 exactly")
lastErrMsg = DateTime.Now;
}
}
答案 1 :(得分:1)
使用计时器。在您的catch中,不要执行错误消息,而是创建Timer对象。向该计时器的已用事件添加一个处理程序,该处理程序仅在值仍然无效时才显示该消息。
catch (FormatException fEX)
{
if (MyFormatExcTimer == null) {
MyFormatExcTimer = new Timer(1000);
MyFormatExcTimer.elapsed += async ( sender, e ) => await HandleTimer();
MyFormatExcTimer.start();
}
}
private static Task HandleTimer()
{
if (... format is still bad ...)
{
Message.Box("Value must be a divisisable by 1 exactly");
} else {
MyFormatExcTimer.Stop();
}
MyFormatExcTimer.Dispose();
MyFormatExcTimer = null;
}
这不是很完整。您可能需要在不同的事件中创建或处置或启动或停止计时器,但是如果没有看到更多的代码,则很难说清楚。我可能实际上没有让程序在输入错误时触发异常,但接受任何输入并拥有自己的代码来测试它。我的代码会在任何文本更改事件中被触发,并且如果输入错误则可以启动计时器,或者如果输入正常则停止它。 此外,您可能会考虑在输入过程中甚至不触发任何消息,而是在用户尝试保存数据时触发验证数据...但是假设您有一个“保存”按钮或类似的东西,您可能不会。