3

我目前正在开发一个 WinForms 项目,并且表单上有一些文本框用于接受用户输入。根据用户输入的值,计算表单上其他字段的值。因此,我很困惑我应该使用两个事件处理程序中的哪一个来执行计算:textbox_Leave还是textbox_TextChanged

由于textbox_TextChanged每次用户更改文本框中的字符时都会触发,所以我觉得在处理器使用方面非常昂贵,不是吗?另一方面,textbox_Leave仅在用户退出文本框后执行。但是,该TextChanged事件确实为用户提供了更好的响应体验。但是这种体验值得我们进行额外的处理吗?如果我使用 ,我的项目能否在处理器速度较慢的旧系统上正常运行TextChanged

4

5 回答 5

2

首先,我会说用简单的案例来测试它。如果您的计算不是太重,那么首先可能不会有问题。

如果计算真的很繁重,而你仍然想要更人性化的解决方案,你可以使用定时器来实现一个节流机制:在 TextChanged 事件中,使用 Tick 处理程序启动一个定时器,该定时器在一定延迟后开始计算;如果在计时器开始之前收到另一个 TextChanged 事件,请重置计时器。当然,这将涉及计时器事件和 textchanged 事件之间的一些同步和可能的锁定。

于 2012-11-23T08:41:52.163 回答
1

这里的诀窍是如果你不需要就不要处理,我通常会安排“繁重的东西”,如果TextBox没有再次更改,则在一段时间后运行它。像这样的东西:

  • 文本框已更改,取消之前的预定更新
    • 以x 毫秒为单位安排更新(这取决于应用程序类型)
  • 文本框离开,立即更新。
于 2012-11-23T08:42:10.500 回答
0

根据您尝试执行的计算的描述,我认为即使在较旧的计算机上您也不会看到问题。与用户键入内容的速度相比,您可能低估了计算机的功能。

假设为了争论,一个快速打字员每分钟可以输入 100 个单词。这大约是 800 个字符,这意味着该事件每秒将触发大约 13 次。

因此,餐巾纸数学告诉我们,在用户键入另一个字符之前,我们有大约 76 毫秒的时间来执行计算并在屏幕上获得结果。

这似乎是过早优化的情况。作为一般规则,您不应该预先优化代码,因为我敢打赌您不会需要它

也就是说,我曾经写过一个名为 DelayedAction 的类,如果您确实需要优化,它将满足您的需求。我现在没有代码,但快速谷歌发现了一些非常相似的东西。

http://www.codeproject.com/Tips/240274/Execute-later-for-delayed-action

于 2012-11-24T04:21:12.503 回答
0

我更喜欢使用Validated事件来执行依赖于输入的计算。TextChanged将在用户仍在输入其值时触发,并且可能在输入仍然无效时触发。如果您处理该Validating事件,则可以防止在文本框中输入无效值,并确保Validated仅在输入有效时才会触发。

于 2012-11-23T08:42:43.787 回答
0

如果您正在寻找用户进行实时计算,我会使用 textChanged。仅当光标离开 textBox 时才更改值可能会让用户感到困惑和沮丧。

在不知道您的计算有多复杂的情况下,很难准确地说出成本。如果您担心经常发生这种情况,则有几种可能的解决方案。如果实时性不重要,那么不要使用“离开”事件,而是为用户提供“计算”按钮,并寻找 Enter 按键。这对您的最终用户来说比挥动光标来计算要直观得多。

另一种可能的解决方案是实现一个计时器,该计时器启动 textChanged 事件(或者如果它有时间则重置),并且仅在它到期时执行计算。这样一来,快速打字员就不会在短时间内进行大量计算,但您仍然可以近乎实时地提供用户体验,而无需用户按其他任何操作。

于 2012-11-23T08:45:12.867 回答