C#密钥更新事件问题

C#密钥更新事件问题,c#,winforms,C#,Winforms,我使用keyup事件来添加通过按enter光标移动到下一个控件的功能。此事件有效,但我在文本框中键入了一些内容,然后按enter键将光标移动到下一个控件,但我在上一个控件中键入的字母是清晰的。我没有在代码的任何地方添加clear函数。 代码如下: private void nametextBox_KeyUp(object sender, KeyEventArgs e) { if(e.KeyCode == Keys.Enter) {

我使用keyup事件来添加通过按enter光标移动到下一个控件的功能。此事件有效,但我在文本框中键入了一些内容,然后按enter键将光标移动到下一个控件,但我在上一个控件中键入的字母是清晰的。我没有在代码的任何地方添加clear函数。 代码如下:

    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将标记不应执行默认命令。但是,这将影响窗口中的所有控件,这意味着您需要在需要时手动添加换行功能

我还建议您对每个密钥更新事件使用相同的处理程序,除非您对每个事件添加了不同的内容。您可以通过将发送器作为
控件来传递,而不是手动传递每个控件:

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);
}

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将标记不应执行默认命令。但是,这将影响窗口中的所有控件,这意味着您需要在需要时手动添加换行功能

我还建议您对每个密钥更新事件使用相同的处理程序,除非您对每个事件添加了不同的内容。您可以通过将发送器作为
控件来传递,而不是手动传递每个控件:

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);
}

您可以向我们显示SelectNextControl方法中的代码吗?
SelectNextControl
是一个错误,是因为您的nameTextBox\u键向SelectNextControl传递nameTextBox吗?您是否应该传入其他控件?能否显示SelectNextControl方法中的代码?
SelectNextControl
是一个错误,是因为您的nameTextBox\u KeyUp正在将nameTextBox传递给SelectNextControl吗?你应该传递一个不同的控件吗?我已经创建了一个演示应用程序,它适合我。我使用了两个文本框控件。你在使用文本框吗?我忘了将文本框设置为多行。我道歉。我找到了解决办法。请在几分钟后检查我编辑的答案。但我发现了我的错误,实际上我选择了文本框作为多行,现在我在form1.cs[designer]级别取消选中多行,它可以工作了。谢谢大家:-)好的,很高兴听到这个消息。我已经编辑了我的答案,以防你将来需要多行文本框:)我已经创建了一个演示应用程序,它适合我。我使用了两个文本框控件。你在使用文本框吗?我忘了将文本框设置为多行。我道歉。我找到了解决办法。请在几分钟后检查我编辑的答案。但我发现了我的错误,实际上我选择了文本框作为多行,现在我在form1.cs[designer]级别取消选中多行,它可以工作了。谢谢大家:-)好的,很高兴听到这个消息。我已经编辑了我的答案,以防将来需要多行文本框:)