C# - 在MessageBox中按Enter键触发控制KeyUp事件

时间:2010-08-21 20:26:14

标签: c# winforms

系统:Windows7 Pro,Visual Studio 2010,C#

我有一个文本框: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,当我在MessageBox OK按钮上按 ENTER 时,它还会触发textBox1_KeyUp,这会导致MessageBox再次显示。 因此,它触发MessageBox确定按钮,使其消失,并触发textbox_keyUp,然后再次显示消息框。

感谢您的帮助。

3 个答案:

答案 0 :(得分:19)

是的,消息框响应按键事件。你的TextBox也应如此。使用KeyDown事件,问题解决了。还解决了用户通常听到的恼人的BEEP。

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

答案 1 :(得分:1)

我为listview解决了它,它可以用于文本框:

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

答案 2 :(得分:0)

控件只会在有焦点的情况下触发事件。因此,在您的情况下,您正在执行按钮单击,焦点仍然在文本框上,这就是您无法在消息框中使用Enter的原因。解决方案是在button1_Click方法中添加以下代码:

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

此时焦点将设置在按钮上,因此如果您在消息框中按Enter键,则不会触发文本框的事件