SelectNextControl正在选择自己

时间:2014-10-23 17:57:14

标签: c# winforms event-handling keydown

问题

我试图获取一个文本字段来处理TabEscape来处理用户密码字段。我目前在PreviewKeyDown上触发了一个事件,允许我在KeyDown事件上捕获EscapeTab,然后在KeyDown事件中捕获它,如下所示:

private void passwordText_KeyDown(object sender, KeyEventArgs e)
{
   if (e.KeyCode == Keys.Tab)
   {
      bool success = this.SelectNextControl(ActiveControl, true, false, true, true);
      e.Handled = true;
      e.SuppressKeyPress = true;
   }
   else if (e.KeyCode == Keys.Escape)
   {
      keepPassword = false;
      bool success = this.SelectNextControl(ActiveControl, true, false, true, true);
      e.Handled = true;
      e.SuppressKeyPress = true;
   }
   else
   {
      e.Handled = false;
      base.OnKeyDown(e);
   }
}

private void passwordText_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
   if (e.KeyCode == Keys.Tab || e.KeyCode == Keys.Escape)
   {
      e.IsInputKey = true;
   }
}

我遇到的问题是SelectNextControl命令返回true,但ActiveControl没有改变。它仍在passwordText控件上。

进一步洞察

它调用Leave覆盖,然后调用Enter覆盖。如果我从事件中删除Leave,它会正确选择下一个控件。我在这里发布代码来自Leave,而我在解决问题:

  private void passwordText_Leave(object sender, EventArgs e)
  {
     if (passwordText.ReadOnly == false)
     {
        if (keepPassword) // This is used to handle the case of using ESC to cancel the password entry.
        {
           // Change user password accordingly.
           password = GlobalDataStore.HashPassword(passwordText.Text);
        }
        else
        {
           keepPassword = true;
        }

        if (String.IsNullOrWhiteSpace(passwordText.Text))
        {
           passwordText.Text = "";
        }
        else
        {
           passwordText.Text = "(Hashed Password)";
        }
        passwordText.UseSystemPasswordChar = false;

        passwordText.ReadOnly = true;
     }
  }

当前解决方法

我将Leave事件的内容移动到一个单独的函数ProcessPasswordTextLeave()中。在KeyDown事件内,在我执行select之前,我删除Leave事件,执行选择,运行ProcessPasswordTextLeave()函数,然后再次添加Leave事件。凌乱,但它现在有效。我更喜欢更优雅的东西。我还想知道为什么将其作为Leave事件处理还原为它。

0 个答案:

没有答案