【问题标题】:Using backspace to move back to previous textBox (C#)使用退格键移回上一个文本框(C#)
【发布时间】:2014-05-09 12:56:13
【问题描述】:

这可能是一个简单的问题。我是 C#(和大多数编程)的新手,我正在尝试制作一个由两个文本框组成的程序。这些文本框中的信息会经常被删除,并且需要输入新信息,因此需要快速。为方便起见,我试图让退格键重新聚焦在前一个文本框上,而不是使用 Shift+Space 或单击。这就是我所拥有的。程序运行了,但是下面的代码似乎并没有按照我的意图去做。

if (e.KeyCode == Keys.Back && textBox2.TextLength == 0)
  textBox1.Focus();

所以,当 textbox2 有 0 个字符并且随后键入退格键时,我希望它移回 textbox1。谢谢你的帮助。

【问题讨论】:

  • 这段代码什么时候运行?
  • 正如@Yahya 指出的那样,在哪种情况下你会这样做?另外,该代码的 intended 是什么,但没有发生?我会用TextChanged 来做,并且只会检查textBox2.Text.Length == 0。在任何情况下,当textBox2 内容更改 并且变为空(退格、全选和删除等)时,这会将焦点移至textBox1
  • 我在 KeyUp 中这样做,但尝试了 TextChanged。如果我只使用 TextChanged 下的 textBox2.Text.Length == 0,则按一次退格键会导致文本长度变为零,并且光标会立即转到 textBox1。如果您需要删除 textBox2 中的 1 个字符并重新输入,这会很痛苦。它要求您点击选项卡再次移回 textBox2。如果 textBox2 中有 1 个字符,我实际上是在按两次退格键后使其移回 textBox1。第一个清除字段,第二个将光标移动到 textBox1。

标签: c# winforms events


【解决方案1】:

因此,要完成这项工作,您需要确保在 KeyUp 上运行此代码,但您也不需要多个 KeyUp 处理程序来执行此操作。考虑这个KeyUp 处理程序:

private void textBox_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
    var textBox = sender as TextBox;
    if (textBox == null) { return; }

    if (e.KeyCode == Keys.Back && textBox.Text.Length == 0)
    {
        // this here of course being the Form
        // Select causes the form to select the previous control in the tab order
        this.Select(true, false);
    }
}

现在只需将此处理程序附加到所有您希望以这种方式运行的文本框,它们都会起作用。

【讨论】:

  • 这还不适合我。单个文本框同时和分别拥有 EventArgs 和 KeyEventArgs 是否有问题?
  • @user3620471:不要双击设计器的文本框。单击控件,按 F4,转到事件选项卡,然后双击 KeyUp 事件。
【解决方案2】:

我终于让它工作了。我所做的与我之前尝试的并没有太大的不同,但这就是我的做法。

  1. 我从 .cs [Design] 视图创建了两个文本框。
  2. 我选择了每个框并单击“属性”下的“事件”闪电图标。这是我之前在这不起作用时遗漏的内容。
  3. 我将它们都设置为 KeyPress 和 TextChanged(即 textBox1_KeyPress 和 textBox1_TextChanged(对 textBox2 做了同样的事情)。我不知道这是否是它起作用的部分原因。我只是在记录我的操作。
  4. 我双击了每个文本框,它为每个文本框创建了一个 EventArgs。这是我存储常规代码的地方。
  5. 除了 EventArgs,我还手动创建了一个 KeyEventArgs(见下文),我在其中放置了 Backspace 函数。这是代码:
// Here is the KeyEventArgs I created using KeyPress (Public).

public void textBox2_KeyPress(object sender, KeyEventArgs e)

       {

           if (e.KeyCode == Keys.Back && textBox2.Text.Length == 0)
               textBox1.Focus();
       }


// Here is where the rest of my code (Private).

private void textBox2_TextChanged(object sender, EventArgs e)

           {
           if (textBox2.Text == "A")
               richTextBox3.Text = "January";

           if (textBox2.Text == "B")
               richTextBox3.Text = "February";

           if (textBox2.Text == "C")
               richTextBox3.Text = "March";

// Code Continues...

抱歉,如果不清楚。我只是想记录我所做的事情,以防以后对某人有所帮助。谢谢大家的帮助。

【讨论】:

  • 您应该编辑原始问题以添加额外信息,或使用 cmets 与人讨论小问题。如果您没有回答问题,请不要使用答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多