防止多次触发按键事件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");
}
}
谢谢!
您正在多次添加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应用程序,让您可以实际观察发生了什么!