防止多次触发keydown事件C#

时间:2011-08-25 07:34:12

标签: c# winforms

我想允许用户在文本框中输入时发送他的消息。 我去搜索并使用下面的示例代码。

现在的问题是当我按下回车时,事件会被触发不止一次,大约4-5次。

其他人建议使用keyup。我尝试过keyup,keydown和keypress。都有同样的问题。 我如何防止它多次触发事件?

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 个答案:

答案 0 :(得分:3)

这是因为每次更改文本时,都会调用/ kick的tbxAnswer_TextChanged为keyup事件分配一个动作;如果文本被更改了4次,那么您分配了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 :(得分:3)

您多次添加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");
    }
}

答案 2 :(得分:1)

将您的代码更改为此

tbxAnswer.KeyUp -= tbxAnswer_KeyUp;
tbxAnswer.KeyUp += new KeyEventHandler(tbxAnswer_KeyUp);

答案 3 :(得分:0)

在您的代码段中,只要TextBox的文本发生更改,另一个事件处理程序就会添加到KeyUp处理程序中。您应该只添加一次事件处理程序(例如,在创建文本框之后)。

答案 4 :(得分:0)

Sara和Jon已经为您的具体问题提供了正确的答案。但是,如果您想进一步了解如何以及何时使用任何特定的键处理事件,请查看我的文章Exploring Secrets of .NET Keystroke Handling。我解释并绘制每个事件有用的时间和地点,并提供一个 KeystrokeSandbox 应用程序,让您实际观察会发生的事情!