簡體   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