【问题标题】:How to efficiently determine if the user has actually produced input in C#如何有效地确定用户是否在 C# 中实际产生了输入
【发布时间】:2015-01-19 10:09:11
【问题描述】:

在这里使用文本编辑器...

我试图弄清楚在键盘事件发生后用户是否真的导致了文本框中的任何更改。显然,如果他们按下像 A B C 这样的标准键,它会触发,但如果有办法,我更感兴趣,此外枚举所有可能的非输入选项。

我会注意到我意识到文本框的状态可以在前后进行比较,但是如果它是一个大文档,这似乎会占用内存和 CPU 时间。另外,我将Modified 属性用于另一个目的,因为它只在它更改时触发,所以这也不是一个选项,因为它通常会处于true 状态。

我虽然谈到了枚举方面,但这似乎也效率低下,因为我不仅要确保每个非输入选项都在那里,还要检查所有异常。想到的一个例子:

如果 Ctrl 被按下,我不想做任何事情,除非我有 Ctrl + VCtrl + X.

但是,如果剪贴板中没有任何内容,那么 Ctrl + V 不应该做任何事情,如果没有选择任何内容,那么 Ctrl + X 不应该做任何事情。

我确信还有更多我现在没有想到的例外情况。

至于 Modified 属性,当它发生变化时,我会根据它的状态使用它来修改带有/不带有星号的寡妇标题。因此,如果我重置属性,它将删除星号。

【问题讨论】:

  • 对内容进行哈希处理怎么样?
  • @SteveB 随意添加该方法。虽然我认为由于 .NET 已经触发了 TextChanged 事件,但这是最快的方法,因为它添加了一个函数调用以及函数内部的任何代码。

标签: c# textbox textchanged


【解决方案1】:

在著名的rubber duck debugging 方法中,我最终只是通过询问它来解决这个问题。如果我错过了更有效的选择,请告诉我。

第一个也是最简单的选择是使用TextChanged 事件,我实际上是通过在我的帖子中添加标签了解到的。

如果出于某种原因对未来的读者不起作用,那么使用ModifiedChanged 事件将是下一个最佳选择。

简单地说,在我的情况下,星号只有在保存文档时才会消失。通过设置标志,我可以使用if 语句来确定是否需要删除它,然后在该点重置标志。像这样的:

void saved(){
    // ...
    saved = true;
}

// ...
if(saved){
    removeAsterisk();
    saved = false;
}
// ...

这些似乎是最好的选择,既不长代码,也不通过检查 100k 个字符来消耗时间。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2014-06-30
    相关资源
    最近更新 更多