我想允许用户在文本框中输入时发送他的消息。 我去搜索并使用下面的示例代码。
现在的问题是当我按下回车时,事件会被触发不止一次,大约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");
}
}
谢谢!
答案 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 应用程序,让您实际观察会发生的事情!