C# keyup 事件问题

标签 c# winforms

我使用 keyup 事件来添加通过按下 enter 光标移动到下一个控件的功能。此事件有效,但我在 TextBox 中键入了一些内容,然后按回车键将光标移动到下一个控件,但我在上一个控件中键入的字母很清楚。我没有在我的代码中的任何地方添加明确的功能。 这是代码:

    private void nametextBox_KeyUp(object sender, KeyEventArgs e)
    {
        if(e.KeyCode == Keys.Enter)
        {
            this.SelectNextControl(nametextBox, true, true, true, true);
        }
    }

    private void emailtextBox_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            this.SelectNextControl(agetextBox, true, true, true, true);
        }

    }

最佳答案

e.Handled 标志设置为 true 以防止默认键操作,我怀疑这些操作正在向您的控件添加新行并隐藏文本:

    if(e.KeyCode == Keys.Enter)
    {
        this.SelectNextControl(nametextBox, true, true, true, true);
        e.Handled = true;
    }

您需要覆盖 ProcessCmdKey 以防止输入新行并隐藏您的文本。 (或者,如果适合您,您可以将文本框设置为单行)。否则,将其添加到您的窗口逻辑中:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Enter)
        return true;
    return base.ProcessCmdKey(ref msg, keyData);
}

返回 true 将标记不应执行默认命令。但是,这将影响窗口中的所有控件,这意味着您需要在需要时手动添加换行功能。

我还可以建议您对每个按键弹起事件使用相同的处理程序吗,除非您要向每个事件添加不同的内容。您可以通过将发件人作为 Control 而不是手动传递每个控件来执行此操作:

private void Control_KeyUp(object sender, KeyEventArgs e)
{
  if(e.KeyCode == Keys.Enter)
      if(sender is Control)
          this.SelectNextControl((Control)sender, true, true, true, true);
}

关于C# keyup 事件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38577953/

相关文章:

c# - 如何在 C# 中实现 MaxSubArray?

c# - ASP.NET 和 C#

c# - 如何打开进程并使整个类(class)都可以使用 Steam 读/写器

c# - 如何将日期时间转换为 C# 中的特定时区?

c# - 如何覆盖 PropertyGrid 中 DockStyle 编辑器的行为

c# - 获取另一个线程上的 RichTextBox 中的文本

c# - MVC Razor 字符问题

c# - 如何从 diff 应用程序读取 app.config 中的用户设置?

c# - C# Parent 和 Child 中的 MDI 窗体

c# - 在 Windows 窗体 (C#) 中使用一个声明设置多个属性