2011-03-12 12 views
6

我有一个Textbox控件,它有时以编程方式更新,也可以由用户更新。 我如何区分这两个事件? 我想在用户更改文本时将“脏”标志设置为“真”。只有用户输入的c#textbox事件

+0

你是[数据绑定](http://msdn.microsoft.com/en-us/library/ms752347.aspx)? – 2011-03-12 00:21:13

+0

该控件没有数据绑定... – kaycee 2011-03-12 00:30:42

回答

6

您可以使用文本框的键按下事件之前保存的价值。

 private void textBox1_KeyDown(object sender, KeyEventArgs e) 
    { 
     //Insert the code you want to run when the text changes here! 
    } 
+0

这个事件是有效的文本框,但我想知道其他控制像NumericUpDown怎么样... – kaycee 2011-03-12 00:26:25

+2

是的,这个解决方案不是所有控件的最干净。但是,numericupdown控件确实包含keydown事件和mousedown事件。我想你可以同时使用它们和追踪控件的值。另外,每次编程改变值时,你总是可以抛出一个布尔标志,然后检查控件的ValueChanged事件中的布尔标志(在继续处理之前将其设置回默认值)。这当然是一个非常简单的解决方案 - 可能不是最优雅的。 – 2011-03-12 13:39:54

+1

如果用户用鼠标剪切并粘贴文本框中的数据,这不起作用。 – 2013-03-11 14:52:50

2

避免在编程完成时设置“脏”标志。禁用事件处理程序或设置一个标志,上面写着“这是代码,而不是用户”

+0

在内联更改的持续时间内禁用事件处理程序是一个好主意。它还解决了用户将文本粘贴到框中时可能遇到的任何问题。 – 2016-06-22 08:46:38

0

尝试的onblur

这会引起用户离开现场的那一刻。

您可以解决它与聚焦状态一起编辑

+0

好主意,但不是100%有效。会比我的回答“清洁”一点 – 2011-03-12 00:05:42

+0

如果它不起作用,那么“清洁”就没有意义。简单地分离处理程序对于这种事情是非常标准的。 – 2011-03-12 00:12:01

+0

他不是在谈论残疾人处理程序,而是关于额外的标志。那么,它是一个额外的国旗或额外的处理程序... – 2011-03-12 00:15:44

5

我的解决方案 类型的工作,复制并粘贴在TextChanged事件的TextBox

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

     } 
    } 
+3

如果控件具有焦点,但文本正在以编程方式更改,该怎么办? – Pedro 2011-09-24 17:22:23

+0

使用Textchnaged委托进行控制联合并使用其他编程方式更改 – naderi 2011-09-24 18:41:44

2

检查修改的属性。如果为true,则更改是由用户进行的,否则以编程方式更改文本。