繁体   English   中英

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

[英].NET: TextChanged event for TextBox not always firing, even though KeyUp and KeyDown are firing

我遇到了一个非常特殊的问题。 我注意到偶尔输入我的TextBox时,我会丢失一些按键。 我在这个TextBox挂钩的事件中添加了一堆跟踪语句,我发现当我丢失击键时,KeyUp,KeyDown和KeyPress事件都被正确触发,但TextChanged事件从未被触发。

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

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

嗯....

这将是一个镜头,但是,你确实说过你有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;
        }

MSDN中查看有关此Handled属性的信息。 (如果您在本地安装了MSDN 2008 SP 1,则链接为ms-help://MS.MSDNQTR.v90.en/fxref_system.windows.forms/html/dfc80b44-1d79-6315-cbea-1388a048c018.htm

报价:

Handled is implemented differently by different controls within Windows Forms. 
For controls like TextBox which subclass native Win32 controls, it is 
interpreted to mean that the key message should not be passed to the underlying 
native control. 

If you set Handled to true on a TextBox, that control will not pass the key 
press events to the underlying Win32 text box control, but it will still 
display the characters that the user typed.

也许它没有设置,即e.Handled = false; 从而防止TextChanged事件被触发?

你能检查一下吗?

编辑:在dreadprivateryan的回复之后,我可以怀疑(由于缺少发布的代码),基于他的回复,e.Handled在按下Enter键时是真的,对于我认为的其他一切都是假的,认为这就是为什么由此没有接受进一步的击键。

  • 您是否在按下Enter键时将焦点设置为另一个控件? 可能是KeyUp和KeyDown都有冲突......
  • 取下键盘钩并禁用它...
  • 我的建议是以这种方式完全改变代码,如图所示,取出KeyDown或KeyUp事件处理程序,简单地说,它们是相同的,好的,技术上,它分别指定为按下一个键时,同样当钥匙被释放时。 这里看一下这个链接。 有发布一个类似的问题在这里的SO。

在下面的示例中,我使用keyUp事件处理程序在按下回车键时将焦点切换到下一个可用控件。 在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;                                                                
}

希望这会有所帮助,最好的问候,汤姆。

我实际上并不知道,但我随机猜测:你在VM中运行?

您可以使用的一种方法是创建一个读取文本的计时器,并与之前输入的值进行比较。 当事件处理程序代码不等于先前检查的值时,调用它。 当您需要使用最终输入的值时,请执行一次额外检查,以防计时器尚未触发。

你的意思是按键实际上已经丢失并且永远不会出现在盒子里吗? 或者你的意思是你没有得到每个按键的TextChanged事件?

我相信TextChanged事件是由操作系统的EN_CHANGE通知驱动的,该通知是通过WM_COMMAND消息发送的。 我知道Windows中的某些类型的消息被“合并”以避免冗余通知。 例如,WM_MOUSEMOVE消息可能会发生这种情况,这也是鼠标在屏幕上移动的每个像素都没有收到鼠标移动事件的原因。

我不能肯定地说,但我怀疑TextChanged事件也是这样的。 我可以说,替代输入方法也有这种副作用。 使用Tablet PC输入面板时,文本框不会为每个字符获取TextChanged通知。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM