簡體   English   中英

防止多次觸發keydown事件C#

[英]Prevent multiple firing of keydown events C#

我想允許用戶在文本框中按Enter時發送消息。 我去搜索和即時通訊使用下面的示例代碼。

現在的問題是,當我按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");

        }
    }

謝謝!

這是因為每次更改文本時,都會調用/觸發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");

        }
    }

您將多次添加KeyUp事件處理程序(在TextChanged處理程序內部); 因此,當按下Enter鍵時,處理程序將執行多次。

您要在此處執行的操作是,在InitializeComponent()調用之后,僅在窗體的構造函數中添加一次KeyUp處理程序:

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.KeyUp -= tbxAnswer_KeyUp;
tbxAnswer.KeyUp += new KeyEventHandler(tbxAnswer_KeyUp);

在您的代碼段中,每當TextBox更改時,就會將另一個事件處理程序添加到KeyUp處理程序中。 您僅應添加一次事件處理程序(例如,僅在創建文本框之后)。

Sara和Jon已經為您的特定問題提供了正確的答案。 但是,如果您想走得更遠並且對如何以及何時使用任何特定的鍵處理事件有更好的了解,請看一下我的文章“ 探索.NET鍵盤處理的秘密” 我將說明並繪制每個事件在何時何地有用的圖表,並提供一個KeystrokeSandbox應用程序,讓您實際觀察會發生什么!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM