代码之家  ›  专栏  ›  技术社区  ›  Thalia

c#文本框KeyEventArgs-每个字母被检查多次

  •  0
  • Thalia  · 技术社区  · 12 年前

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

    它一直工作得很好,但我现在尝试执行的任务通常是用鼠标点击完成的。因此,在该任务的OK(a FolderBrowserDialog ),它一直在调用对话框控件。

    奇怪的是,尽管调试器向我显示了if分支,但对于e,它显示了 {KeyData = LButton|MButton|Back} 但是 KeyValue 还是13。。。

    我认为这可能是因为文本框记得它的最后一个条目。。。是吗?

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

    我似乎处于一个准无限循环中,但在多次“ok”之后,它就会消失。我发现,对于我在文本框中键入的每一个字母,我都会在CheckKeys中花费4到5轮。我不明白为什么。。。或者如何修复。

    我加了一个“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);
          }
        }           
    }
    

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

    非常感谢。

    3 回复  |  直到 12 年前
        1
  •  1
  •   Jignesh Thakker    12 年前

    在您的代码中,您在TextChanged事件中添加了KeyUp的处理程序。因此,当TextChanged时,将为KeyUp事件添加新的处理程序。这就是为什么每封信都要多次检查的原因。将处理程序置于Form加载事件。

    例如,如果我在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);
      }
      }           
    }
    

    还有一件事,当我理解你的代码时,你想执行 btnBrowse_Click 如果在TextBox控件中按下Enter键。但是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
  •  1
  •   Hamid    12 年前

    使用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
  •  0
  •   Thalia    12 年前

    已替换 TextChanged 具有 KeyDown 直接,它再次工作!

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

    编辑:现在看完公认的答案,我明白了。。。