Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET:TextBox的TextChanged事件并不总是触发,即使KeyUp和KeyDown正在触发_C#_.net_Winforms_Textbox - Fatal编程技术网

C# .NET:TextBox的TextChanged事件并不总是触发,即使KeyUp和KeyDown正在触发

C# .NET:TextBox的TextChanged事件并不总是触发,即使KeyUp和KeyDown正在触发,c#,.net,winforms,textbox,C#,.net,Winforms,Textbox,我遇到了一个非常奇怪的问题。我注意到,偶尔在文本框中输入时,我会丢失一些按键。我在这个文本框连接的事件中添加了一组跟踪语句,我发现当我失去击键时,KeyUp、KeyDown和KeyPress事件都正确触发,但TextChanged事件从未触发 有人知道为什么会这样吗?我可以把它写成一个“.NET bug”,但我更想知道这里是否有解决方案 如果有人建议我使用KeyUp/KeyDown事件来确定文本是否已更改,那么也存在一个问题。每次按键都会多次调用KeyUp/KeyDown,因此很难确定是否有人多

我遇到了一个非常奇怪的问题。我注意到,偶尔在文本框中输入时,我会丢失一些按键。我在这个文本框连接的事件中添加了一组跟踪语句,我发现当我失去击键时,KeyUp、KeyDown和KeyPress事件都正确触发,但TextChanged事件从未触发

有人知道为什么会这样吗?我可以把它写成一个“.NET bug”,但我更想知道这里是否有解决方案


如果有人建议我使用KeyUp/KeyDown事件来确定文本是否已更改,那么也存在一个问题。每次按键都会多次调用KeyUp/KeyDown,因此很难确定是否有人多次键入同一个字母。

我不知道,但我有一个随机猜测:你在虚拟机中运行吗


您可以使用的一种方法是制作一个计时器,读取文本并与之前输入的值进行比较。当事件处理程序代码不等于先前选中的值时,调用该代码。当您需要使用最终输入的值时,再做一次检查,以防计时器尚未启动。

您的意思是按键实际上已丢失,并且从未出现在框中?或者你的意思是,你不会在每次按键时都收到文本更改事件

我相信TextChanged事件是由操作系统的EN_更改通知驱动的,该通知通过WM_命令消息发送。我知道Windows中的某些消息是“合并”的,以避免冗余通知。例如,WM_MOUSEMOVE消息可能会发生这种情况,这就是为什么您不会为鼠标在屏幕上移动的每个像素接收鼠标移动事件

我不能肯定,但我怀疑TextChanged事件也会以这种方式运行。我可以说,尽管交替输入法也有这种副作用。使用Tablet PC输入面板时,文本框不会收到每个字符的文本更改通知。

Hmmm

这将是一个镜头,但是,你说过你有KeyUp、KeyDown和KeyPress事件处理程序,对吗?在事件处理程序中将标志e.Handled设置为true后,请查看以下内容:

private void textBox1_KeyDown(object sender, KeyEventArgs e) { e.Handled = true; } private void textBox1_KeyUp(object sender, KeyEventArgs e) { e.Handled = true; } private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = true; } 可能未设置,即
e.Handled=false从而防止触发TextChanged事件

你能确认一下吗

编辑:在Dreard Privateryan的回答之后,我可以根据他的回答怀疑(由于没有发布代码),e.按下Enter键时Handled为true,而其他所有键均为false,我认为这就是为什么不会再接受击键的原因

  • 按下Enter键时,是否尝试将焦点设置为另一个控件?可能是键向上和键向下都有冲突
  • 卸下键盘挂钩并禁用它
  • 我的建议是以这种方式完全更改代码,如图所示,去掉KeyDown或keydup事件处理程序,因为简单地说,它们是相同的,好的,从技术上讲,它分别用于按下一个键和释放一个键。看看这个链接。有一个类似的问题张贴在SO上
在下面的示例中,我使用keyUp事件处理程序在按下enter键时将焦点切换到下一个可用控件。在KeyPress事件处理程序中,这只是过滤输入,只允许分别使用数字0-9,其他任何内容都将被丢弃。该事件处理程序中包括允许退格键进行编辑

private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) SendKeys.Send("{TAB}"); } private const string VALID_KEYS = "0123456789"; private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (VALID_KEYS.IndexOf(char.ToUpper(e.KeyChar)) != -1 || e.KeyChar == (char)8) e.Handled = false; else e.Handled = true; } 私有void textBox1\u KeyUp(对象发送方,KeyEventArgs e) { 如果(e.KeyCode==Keys.Enter)SendKeys.Send(“{TAB}”); } 私有常量字符串有效_key=“0123456789”; 私有无效文本框1\u按键(对象发送器,按键事件参数e) { if(有效的_KEYS.IndexOf(char.ToUpper(e.KeyChar))!=-1 | e.KeyChar==(char)8) e、 已处理=错误; 其他的 e、 已处理=正确; } 希望这有帮助, 顺致敬意,
Tom。

钥匙实际上丢失了,而且从来没有出现在盒子里——当这种情况发生时,我注意到TextChanged事件也没有触发。感谢您在Windows消息中提供的信息。也许我可以在KeyUp/KeyDown事件期间手动触发该事件?似乎有什么东西正在吞噬该消息。也许在某个地方安装了一个系统范围的消息钩子,该钩子正在运行?或者我敢说,也许是某种键盘记录器?如果你安装了Spy++的话,你应该试着运行它,看看消息是否会传到窗口。程序中确实有一个键盘钩子——这是我应该包含的重要信息。钩子是使用以下代码创建的:SetWindowsHookEx(WH_键盘,KeyFunction,dllinInstance,AppDomain.GetCurrentThreadId());KeyFunction方法检查某些击键,根据击键的内容调用其他函数,然后调用CallNextHookEx函数。我的trace语句告诉我,在我丢失击键的情况下,钩子确实看到了键,并且CallNextHookEx函数被正确调用。你能确认没有钩子击键不会丢失吗?也许您可以在hook proc.Nope周围发布一段代码,而不是在VM中运行。我会考虑一下定时器的想法——好建议。你用什么按键来体验这个?Textchanged是textbox和任何 private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) SendKeys.Send("{TAB}"); } private const string VALID_KEYS = "0123456789"; private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if (VALID_KEYS.IndexOf(char.ToUpper(e.KeyChar)) != -1 || e.KeyChar == (char)8) e.Handled = false; else e.Handled = true; }