2010-08-21 62 views
9

系統:Windows7的專業版,Visual Studio 2010中,C#C# - 推輸入MessageBox的觸發控制KeyUp事件

我有一個文本框:textBox1 我設置它的事件:

textBox1.KeyUp += new KeyEventHandler(textBox1_KeyUp); 

private void textBox1_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     button1.PerformClick(); 
    } 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    if (string.IsNullOrEmpty(textBox1.Text)) 
    { 
     MessageBox.Show("Invalid data", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     return; 
    } 
} 

它工作正常,問題是,當輸入的數據無效,因此顯示MessageBox,當我點擊時,輸入的確定按鈕,它也觸發textBox1_KeyUp,這導致MessageBox再次出現。 因此,它觸發了OK按鈕,導致它消失,並觸發textbox_keyUp,然後導致消息框再次出現。

感謝您的幫助。

回答

17

是的,消息框響應按鍵事件。所以你的文本框。使用KeyDown事件來解決問題。也解決了用戶通常聽到的惱人的BEEP。

private void textBox1_KeyDown(object sender, KeyEventArgs e) { 
     if (e.KeyData == Keys.Enter) { 
      button1.PerformClick(); 
      e.SuppressKeyPress = true; 
     } 
    } 
+0

但是,這是我的問題,我不希望它同時觸發,我希望它僅觸發MessageBox的按鈕 – 2010-08-21 21:25:51

+0

@WoF:我最好拼出來。發佈更新。 – 2010-08-21 21:30:00

+0

它的工作,謝謝你 – 2010-08-21 21:32:46

0

控件只會觸發事件,如果他們有焦點。所以在你的情況下,你正在執行按鈕點擊,焦點仍在你的文本框上,這就是爲什麼你不能在消息框中使用回車。解決的辦法是添加的button1_Click方法中下面的代碼:

var btn = sender as Button; 
btn.Focus(); 

這一次的重點將在按鈕上設定,所以如果你打的消息框中輸入任何情況下,火文本框中

+0

我可以使用輸入消息框。事實上,我想要的只是在MessageBox中使用輸入,而不是在MessageBox和我的按鈕 – 2010-08-21 21:26:38

+0

好吧,但我想說的是,將焦點設置在按鈕上,您可以使用在您的消息框中輸入它不會一次又一次地觸發文本框事件 – tchrikch 2010-08-21 21:35:57

1

我解決了它爲列表視圖,它可以爲文本框的工作:

private void textBox1_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter) 
    { 
     textBox1.enable = false; 
     button1.PerformClick(); 
     textBox1.enable = true; 
    } 
}