C # - Нажатие Enter в MessageBox запускает элемент управления KeyUp Event - PullRequest
11 голосов
/ 22 августа 2010

Система: 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 отображается, когда я нажимаю ENTER на кнопке MessageBox OK, это также вызывает textBox1_KeyUp, что приводит к отображению MessageBoxснова.Таким образом, он вызывает кнопку MessageBox OK, что приводит к его исчезновению, а также вызывает textbox_keyUp, который затем вызывает появление окна сообщения снова.

Спасибо за вашу помощь.

Ответы [ 3 ]

19 голосов
/ 22 августа 2010

Да, окно сообщения реагирует на событие нажатия клавиши.Так должен ваш TextBox.Вместо этого используйте событие KeyDown, проблема решена.Также решает раздражающий звуковой сигнал, который обычно слышит пользователь.

    private void textBox1_KeyDown(object sender, KeyEventArgs e) {
        if (e.KeyData == Keys.Enter) {
            button1.PerformClick();
            e.SuppressKeyPress = true;
        }
    }
1 голос
/ 10 июля 2014

Я решил это для списка, он может работать для текстового поля:

private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        textBox1.enable = false;
        button1.PerformClick();
        textBox1.enable = true;
    }
}
0 голосов
/ 22 августа 2010

Элементы управления будут запускать события, только если они имеют фокус.Так что в вашем случае вы выполняете нажатие кнопки с фокусировкой на текстовом поле, и поэтому вы не можете использовать ввод в окне сообщения.Решение состоит в том, чтобы добавить следующий код в метод button1_Click:

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

Этот фокус времени будет установлен на кнопке, поэтому, если вы нажмете клавишу ввода в окне сообщения, событие для текстового поля не будет запущено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...