Предотвратить многократное срабатывание событий keydown C # - PullRequest
2 голосов
/ 25 августа 2011

Я хочу разрешить пользователю отправлять свое сообщение, когда он нажимает ввод в текстовом поле. Я пошел на поиск, и я использую примеры кодов ниже.

Теперь проблема в том, что когда я нажимаю клавишу ввода, событие запускается более одного раза, например, 4-5 раз.

Кто-то еще предложил использовать keyup. Я пробовал keyup, keydown и нажатие клавиш. У всех одна и та же проблема. Как я могу предотвратить запуск события более одного раза?

private void tbxAnswer_TextChanged(object sender, EventArgs e)
    {
        tbxAnswer.KeyUp += new KeyEventHandler(tbxAnswer_KeyUp);
    }

    private void tbxAnswer_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyValue == (char)13)
        {

            MessageBox.Show("Hello");

        }
    }

Спасибо!

Ответы [ 5 ]

3 голосов
/ 25 августа 2011

Вы добавляете обработчик событий KeyUp несколько раз (внутри обработчика TextChanged); следовательно, когда нажата клавиша Enter, обработчик выполняется несколько раз.

Что вы хотите сделать здесь, это добавить обработчик KeyUp только один раз, внутри конструктора вашей формы, сразу после вызова InitializeComponent():

public MyForm()
{
    // other code possibly here
    InitializeComponent();

    // and now add the event handler:
    tbxAnswer.KeyUp += new KeyEventHandler(tbxAnswer_KeyUp);
}

private void tbxAnswer_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyValue == (char)13)
    {
        MessageBox.Show("Hello");
    }
}
3 голосов
/ 25 августа 2011

Это потому, что каждый раз, когда вы изменяете текст, вызывается / срабатывает tbxAnswer_TextChanged, вы назначаете действие событию keyup; если текст изменяется 4 раза, то вы назначаете событие keyup 4 раза, и оно увеличивается при каждом изменении текста. попробуйте это:

tbxAnswer.KeyUp += new KeyEventHandler(tbxAnswer_KeyUp);
private void tbxAnswer_TextChanged(object sender, EventArgs e)
    {

    }

    private void tbxAnswer_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyValue == (char)13)
        {

            MessageBox.Show("Hello");

        }
    }
1 голос
/ 25 августа 2011

Измените свой код на этот

tbxAnswer.KeyUp -= tbxAnswer_KeyUp;
tbxAnswer.KeyUp += new KeyEventHandler(tbxAnswer_KeyUp);
0 голосов
/ 26 августа 2011

Сара и Джон уже дали правильный ответ на ваш конкретный вопрос.Но если вы хотите пойти дальше и лучше понять, как и когда использовать какое-либо конкретное событие обработки ключа, взгляните на мою статью Изучение секретов обработки .NET Keystroke .Я объясняю и рисую, когда и где каждое событие полезно, а также предоставляю приложение KeystrokeSandbox , которое позволяет вам реально наблюдать за тем, что происходит!

0 голосов
/ 25 августа 2011

В вашем фрагменте кода при каждом изменении текста TextBox в обработчик KeyUp добавляется другой обработчик событий.Вы должны добавлять обработчики событий только один раз (например, сразу после создания текстового поля).

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