我目前正在开发一个WinForms项目,并在表单上有一些用于输入用户的文本框。根据用户输入的值,计算表单上其他字段的值。因此,我很困惑我应该使用哪两个事件处理程序来执行计算:textbox_Leave
或textbox_TextChanged
?
由于每次用户更改文本框中的字符时都会触发textbox_TextChanged
,因此我觉得它在处理器使用方面非常昂贵,不是吗?另一方面,textbox_Leave
仅在用户退出文本框后执行。但是,TextChanged
事件确实为用户提供了更好的响应体验。但这次经历值得我们采取的额外处理能力吗?如果我使用TextChanged
?
答案 0 :(得分:2)
首先,我会说用简单的案例测试它。如果你的计算不是太重,那么首先可能没有问题。
如果计算非常繁重,并且您仍然需要更加用户友好的解决方案,则可以使用计时器实现限制机制:在TextChanged事件中,启动具有Tick处理程序的计时器,该处理程序在某个计时器之后启动计算延迟;如果在计时器启动之前收到另一个TextChanged事件,请重置计时器。当然,这将涉及一些同步以及可能在timer事件和textchanged事件之间的锁定。
答案 1 :(得分:1)
这里的诀窍是不处理,如果你不需要,我通常安排“重型东西”,如果 TextBox 没有再次更改,请在一段时间后运行它。像这样:
答案 2 :(得分:0)
我更喜欢使用Validated
事件来执行依赖于输入的计算。当用户仍在输入其值时,TextChanged
将被触发,并且在输入仍然无效时可能会触发。如果您处理Validating
事件,则可以阻止在文本框中输入无效值,并确保仅在输入有效时才会触发Validated
。
答案 3 :(得分:0)
如果您正在寻找用户进行实时计算,我会使用textChanged。只有在光标离开textBox时才会改变值,这可能会让用户感到困惑和沮丧。
如果不知道计算的复杂程度,就很难准确地说出成本。如果这是你经常关注的事情,那么有几种可能的解决方案。如果实时并不重要,则不要使用“离开”事件,而是为用户提供“计算”按钮,并查找按键输入。对于最终用户来说,这比为了计算它而挥动光标要直观得多。
另一种可能的解决方案是实现textChanged事件启动的计时器(如果它有时间则重置),并且计算仅在它到期时执行。这样一个快速打字员不会在短时间内触发一堆计算,但你仍然可以近乎实时地提供用户体验而无需用户按任何其他内容。
答案 4 :(得分:0)
根据您尝试执行的计算说明,我认为即使在较旧的计算机上也不会出现问题。与用户输入内容的速度相比,您可能低估了计算机的强大功能。
让我们说,为了论证,快速打字员可以每分钟输入100个单词。这大约是800个字符,这意味着该事件每秒会被触发13次。
因此,餐巾纸数学告诉我们,在用户输入另一个字符之前,我们有大约76毫秒来执行计算并在屏幕上显示结果。
这似乎是premature optimisation的情况。 作为一般规则,您不应该预先优化代码,因为我愿意打赌你ain't gonna need it。
那就是说,我写了一个叫做DelayedAction的课程,如果你需要优化的话,它会满足你的需求。我现在没有关于我的代码,但快速谷歌出现了非常相似的东西。
http://www.codeproject.com/Tips/240274/Execute-later-for-delayed-action