只对用户输入的文本框事件

9

我有一个文本框控件,有时会通过编程更新,也可以由用户更新。 如何区分这两个事件? 当用户更改文本时,我希望设置一个“脏”标志为“真”。


你是否正在进行数据绑定? - Austin Salonen
此控件无数据绑定... - kaycee
5个回答

15

在TextChanged事件中检查TextBox的Modified属性。如果为true,则说明更改是由用户进行的,否则文本是通过编程方式更改的。

示例:

void Texbox_TextChanged(object sender, EventArgs e)
{
    if (((TextBox)sender).Modified)
        TextboxUserInput();
}

我只想说谢谢你。它完美地运行着。 - Marco Guignard

9
你可以使用文本框的按键按下事件(Key Down event)。
  private void textBox1_KeyDown(object sender, KeyEventArgs e)
  {
      // Insert the code you want to run when the text changes here!
  }

这个事件适用于文本框,但我想知道其他控件如NumericUpDown是否也适用... - kaycee
2
是的,这个解决方案并不适用于所有控件。然而,numericupdown控件确实具有keydown事件和mousedown事件。我想你可以同时使用它们以及跟踪控件值的方法。或者,每次在编程方式下更改值时,您都可以抛出一个布尔标志,然后在控件的ValueChanged事件中检查该布尔标志(在继续处理之前将其设置回默认值)。那肯定是一个非常简单的解决方案 - 也许不是最优雅的。 - Chris Barlow
2
如果用户使用鼠标在文本框中剪切和粘贴数据,则此方法将无法正常工作。 - Bart Friederichs
是的 - 你可能也得选择MouseDown。 - Chris Barlow
值得注意的是,这只能检测字符输入。例如,使用DEL键从控件中删除数据不会被捕获。解决方法是使用KeyUp和KeyDown事件,但我认为这仍然是一个不太好的解决方案。 - Vinz
1
@Vinzenz,那绝对不是真的。我刚用这段代码捕获了删除键(键值46)。 - Chris Barlow

6

我的解决方案适用于类型、复制和粘贴。

    private void TextChanged(object sender, EventArgs e)
    {
        if (((TextBox)sender).ContainsFocus)
        {

        }
    }

4
如果控件具有焦点,但文本是通过编程方式更改的,该怎么办? - Pedro
使用Textchnaged委托来联合控件,使用else来进行程序化更改。 - naderi

4
不要在程序中设置“dirty”标记。禁用事件处理程序或设置一个标志,表示“这是代码,而不是用户”。

在内联更改的持续时间禁用事件处理程序是一个好主意。这也解决了用户将文本粘贴到框中可能遇到的任何问题。 - shai tibber

0

尝试使用onBlur

这将捕捉用户离开字段的时刻。

您可以与onFocus一起使用它来在编辑之前保存值。


好主意,但不是100%有效。会比我的答案更加“简洁”。 - Dustin Davis
如果它不能正常工作,“清洁”就毫无意义。对于这种情况,简单地分离处理程序是相当标准的做法。 - Ed S.
他所说的不是关于禁用处理程序,而是关于额外的标志。好吧,它可能是一个额外的标志或者一个额外的处理程序... - Radagast the Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接