【问题标题】:c# Textbox KeyEventArgs - each letter is checked multiple timesc# Textbox KeyEventArgs - 每个字母被检查多次
【发布时间】:2012-09-20 01:34:13
【问题描述】:

我正在检查文本框的键码,并且我希望在用户按下 Enter 时执行某个任务。

它一直运行良好,但我现在尝试执行的任务通常是使用鼠标单击完成的。因此,在该任务的确定(FolderBrowserDialog)上,它一直在调用对话框控件。

奇怪的是,即使调试器显示我进入 if 分支,因为 e 它显示 {KeyData = LButton|MButton|Back},但 KeyValue 仍然是 13...

我认为可能是文本框记住了它的最后一个条目......真的吗?

在我的故障排除中,我添加了一个布尔变量,所以我只在它为 true 时进入 FolderBrowser,我尝试在浏览后从文本框中添加和删除一个空格,甚至清除文本框...每次尝试似乎让事情变得更糟。

似乎我处于一个准无限循环中 - 但它会在很多“ok”之后消失,并且逐步通过,我发现对于我在文本框中输入的每个字母,我花费 4 到 5 CheckKeys 中的轮次。我不明白为什么......或者如何解决它。

我添加了一个“e.Handled”,这对我没有好处。

代码如下:

private void txtDir_TextChanged(object sender, EventArgs e)
{
  this.txtDir.KeyUp += new System.Windows.Forms.KeyEventHandler(CheckKeys);
}

private void CheckKeys(object sender, System.Windows.Forms.KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
      if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text))
      {
          btnBrowse_Click(this, e);
      }
    }           
}

为什么我要检查这么多次?我可以添加不同的测试吗?难道我做错了什么 ? (没有设置为默认操作,对于表单或文本框...)

谢谢。

【问题讨论】:

    标签: c# textbox event-handling keyevent


    【解决方案1】:

    在您的代码中,您在 TextChanged 事件中为 KeyUp 添加了处理程序。因此,当 TextChanged 时,将为 KeyUp 事件添加新的处理程序。这就是为什么要多次检查每个字母的原因。将 Handler 放在表单加载事件中。

    例如如果我在 TextBox 中输入了五个字母,那么将为 KeyUp 添加 5 个处理程序。表示 KeyUp 事件处理程序的数量等于调用 TextChanged 事件的次数。

    this.txtDir.KeyUp += new System.Windows.Forms.KeyEventHandler(CheckKeys); 
    

    这为 KeyUp 事件添加了新的处理程序。因此,当这一行执行时,将添加新的处理程序。

    通过将Handler放在Form Load事件中,可以解决多字母检查问题。

    试试看,

    private void FormLoad(object sender, EventArgs e)
    {
             this.txtDir.KeyUp += new System.Windows.Forms.KeyEventHandler(CheckKeys);
    }
    
    private void CheckKeys(object sender, System.Windows.Forms.KeyEventArgs e)
    {
      if (e.KeyCode == Keys.Enter)
      {
      if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text))
      {
          btnBrowse_Click(this, e);
      }
      }           
    }
    

    还有一件事我理解你的代码,如果在 TextBox 控件中按下 Enter,你想执行 btnBrowse_Click。但是 Enter 键没有被 KeyUp 事件处理,您需要 KeyDown 事件处理程序来处理 Enter 键。

    代码:

    private void FormLoad(object sender, EventArgs e)
    {
             this.txtDir.KeyDown += new System.Windows.Forms.KeyEventHandler(CheckKeys);
    }
    
    private void CheckKeys(object sender, System.Windows.Forms.KeyEventArgs e)
    {
      if (e.KeyCode == Keys.Enter)
      {
      if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text))
      {
          btnBrowse_Click(this, e);
      }
      }           
    }
    

    【讨论】:

      【解决方案2】:

      使用 KeyDown 事件而不是 TextChanged 并在其中写下 e.Handle = True 。 在 textBox.KeyDown 事件中写下以下代码:

      if (e.KeyCode == Keys.Enter)
      {
         if (sender == txtDir && txtDir.Text != "" && System.IO.Directory.Exists(txtDir.Text))
         {
             e.Hanlde = true; //it will be close enter keydown handling at this time
             btnBrowse_Click(this, e);
         }
      }    
      

      【讨论】:

      • 我最终做到了这一点,请参阅上面的回答,谢谢您回答这个问题。
      【解决方案3】:

      直接将TextChanged替换为KeyDown,它又可以工作了!

      (顺便说一句,我仍然不明白为什么每个字母都要测试多次......)

      编辑:现在阅读接受的答案后,我明白了......

      【讨论】:

        猜你喜欢
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-03
        • 1970-01-01
        • 2018-08-11
        • 2023-02-03
        • 1970-01-01
        相关资源
        最近更新 更多