0

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

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

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

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

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

似乎我处于一个准无限循环中 - 但它会在很多“ok”之后消失,并且逐步通过,我发现对于我在文本框中输入的每个字母,我都会花费 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);
      }
    }           
}

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

谢谢你。

4

3 回答 3

1

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

例如,如果我在 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);
  }
  }           
}
于 2012-09-20T03:07:01.360 回答
1

使用 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);
   }
}    
于 2012-09-20T05:51:27.990 回答
0

直接替换TextChangedKeyDown,它再次工作!

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

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

于 2012-09-20T03:01:44.450 回答