2010-08-21 61 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; 
    } 
}