2012-09-20 12 views
0

我正在檢查文本框的鍵碼,並且我想要在用戶按下Enter時執行某個任務。c#Textbox KeyEventArgs - 每個字母被多次檢查

它一直在完美運行,但我現在試圖執行的任務通常是使用鼠標單擊完成的。因此,在該任務上的確定(一個FolderBrowserDialog),它不斷調用對話框控件。

奇怪的是,即使調試器顯示我進了,如果分支,爲電子商務它表明{KeyData = LButton|MButton|Back},但KeyValue仍然是13 ...

我想這可能是因爲該文本框記住上次進入..真的嗎?

在我的疑難解答中,我添加了一個布爾變量,所以我只在進入FolderBrowser時它是真實的,我試圖在瀏覽之後添加和刪除文本框中的空格,甚至清除文本框...每個企圖似乎讓事情變得更糟。

似乎我處於一個準無限循環 - 但它會在很多「ok」之後消失,然後逐步通過,我發現對於輸入到文本框中的每個字母,我花了4 CheckKeys 5輪。我不明白爲什麼......或者如何解決它。

我加了一個「e.Handled」,這對我沒有好處。

下面的代碼:

private void txtDir_TextChanged(object sender, EventArgs e) 
{ 
    this.txtDir.KeyUp += new System.Windows.Forms.KeyEventHandler(CheckKeys); 
} 

private void CheckKeys(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text)) 
     { 
      btnBrowse_Click(this, e); 
     } 
    }   
} 

我爲什麼通過這個檢查這麼多次去?我可以添加一個不同的測試嗎?難道我做錯了什麼 ? (沒有設置爲默認操作,對於表單或文本框...)

謝謝。

回答

1

在你的代碼中,你在TextChanged事件中添加了KeyUp的處理程序。所以,當TextChanged新處理程序將被添加爲KeyUp事件。這就是爲什麼每個字母被檢查多次。在表單加載事件中放置Handler。

例如如果我在TextBox中輸入了五個字母,則會爲KeyUp添加5 Handler。表示KeyUp事件處理程序的數量等於調用TextChanged事件的次數。

this.txtDir.KeyUp += new System.Windows.Forms.KeyEventHandler(CheckKeys); 

這爲KeyUp事件添加新的處理程序。所以,當這行執行新的處理程序將被添加。

通過在表單加載事件處理程序,您可以解決多個字母檢查問題。

嘗試用,

​​

還有一件事正如我理解你的代碼,您要執行btnBrowse_Click如果TextBox控件按下回車。但是,輸入鍵沒有用KeyUp事件處理,您需要KeyDown事件處理程序來處理Enter鍵。

代碼:

private void FormLoad(object sender, EventArgs e) 
{ 
     this.txtDir.KeyDown += new System.Windows.Forms.KeyEventHandler(CheckKeys); 
} 

private void CheckKeys(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
    if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text)) 
    { 
     btnBrowse_Click(this, e); 
    } 
    }   
} 
0

直接替換TextChangedKeyDown,它再次工作!

(在一個側面說明,我還是不明白,爲什麼每個字母都經過多次試驗...)

編輯:現在閱讀接受的答案後,我明白......

1

使用KeyDown事件的框TextChanged代替,並寫下e.Handle =真在裏面。 寫下下面你textBox.KeyDown事件代碼:

if (e.KeyCode == Keys.Enter) 
{ 
    if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text)) 
    { 
     e.Hanlde = true; //it will be close enter keydown handling at this time 
     btnBrowse_Click(this, e); 
    } 
}  
+0

我落得這樣做正是這樣,見上面我的答案,謝謝你回答這個。 – Thalia

相關問題