防止多次触发按键事件c#

本文关键字:事件 | 更新日期: 2023-09-27 18:06:48

我想允许用户在文本框中按enter键时发送消息。我去搜索,我使用下面的示例代码。

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

有人建议使用keyup。我试过上键,下键和按键。都有同样的问题。如何防止它多次触发事件?

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");
        }
    }

谢谢!

防止多次触发按键事件c#

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

这是因为每次更改文本时,tbxAnswer_TextChanged被调用/触发,您为keyup事件分配一个操作;如果文本更改了4次,那么你分配了4次keyup事件,每次更改文本时它都会增加。试一下:

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");
        }
    }

把你的代码改成

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

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

Sara和Jon已经给出了你具体问题的正确答案。但是,如果您想进一步了解如何以及何时使用任何特定的键处理事件,请参阅我的文章《探索。net击键处理的秘密》。我解释并说明了每个事件在何时何地有用,并提供了一个KeystrokeSandbox应用程序,让您可以实际观察发生了什么!