如何使用箭头在文本框之间移动光标?

我有几个textboxes ,我希望光标使用箭头键从一个textbox移动到另一个textbox

我怎样才能做到这一点?

它看起来像这样,水龙头也垂直移动,这很奇怪。

谢谢。 在此处输入图像描述

您可以覆盖表单的ProcessCmdKey函数,并处理按键并关注其中的文本框。

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace TextBoxes { public partial class Form1 : Form { List _textBoxes; public Form1() { InitializeComponent(); //Getting a 2 dimentional structure to hold textboxes this._textBoxes= new List(); TextBox[] row1 = new TextBox[4]; row1[0] = textBox1; row1[1] = textBox2; row1[2] = textBox3; row1[3] = textBox4; TextBox[] row2 = new TextBox[4]; row2[0] = textBox5; row2[1] = textBox6; row2[2] = textBox7; row2[3] = textBox8; TextBox[] row3 = new TextBox[4]; row3[0] = textBox9; row3[1] = textBox10; row3[2] = textBox11; row3[3] = textBox12; TextBox[] row4 = new TextBox[4]; row4[0] = textBox13; row4[1] = textBox14; row4[2] = textBox15; row4[3] = textBox16; this._textBoxes.Add(row1); this._textBoxes.Add(row2); this._textBoxes.Add(row3); this._textBoxes.Add(row4); } ///  /// Processes a command key. ///  /// A , passed by reference, that represents the Win32 message to process. /// One of the  values that represents the key to process. ///  /// true if the keystroke was processed and consumed by the control; otherwise, false to allow further processing. ///  protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { //A key was pressed! Control activeCtrl = this.ActiveControl; TextBox txb = activeCtrl as TextBox; //Handle it only if it was sent when a textbox was focused if (txb != null) { int row; int column; //find out which text box is currently active this.GetTextBoxIndexes(txb, out row, out column); //change indexes according to key stroke if (keyData == Keys.Up) { row--; } else if (keyData == Keys.Down) { row++; } else if (keyData == Keys.Left) { column--; } else if (keyData == Keys.Right) { column++; } //Make sure we are not in negative / out of ranfe index row = Math.Abs(row + 4) % 4; column = Math.Abs(column + 4) % 4; //focus requested text box TextBox slected = this._textBoxes[row][column]; slected.Focus(); } //don't forget not to break the chain... return base.ProcessCmdKey(ref msg, keyData); } ///  /// Gets the text box indexes. ///  /// The texbox. /// The out row index. /// The out column index. private void GetTextBoxIndexes(TextBox txb, out int row, out int column) { row = -1; column = -1; for (int rowIdx = 0; rowIdx < this._textBoxes.Count; rowIdx++) { TextBox[] currRow = this._textBoxes[rowIdx]; for (int colIdx = 0; colIdx < currRow.Length; colIdx++) { TextBox currTextBox = this._textBoxes[rowIdx][colIdx]; if (currTextBox.Equals(txb)) { row = rowIdx; column = colIdx; return; } } } } } } 

如果文本框中有一些文本,则以下解决方案有效。

首先创建一个KeyDown事件处理程序:

  private void textBoxLeft_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode.Equals(Keys.Right)) { e.Handled = true; //SendKeys.Send("{TAB}"); textBoxRight.Focus(); } } private void textBoxRight_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode.Equals(Keys.Left)) { e.Handled = true; //SendKeys.Send("+{TAB}"); textBoxLeft.Focus(); } } 

只是创造性地把它放在了我的头顶。 这将为您提供您想要的。

步骤1创建一个TableLayoutPanel并创建第4列和第5行。删除所有原始文本框,然后在步骤2中将其添加到您的代码中。

  TextBox[] text = new TextBox[20]; //these are your new textboxes private void Form1_Load(object sender, EventArgs e) { for(int i=0; i text.Length - 1 ? 0 : i + 1].Focus(); break; } } else if (e.KeyData == Keys.Up) for (int i = 0; i < text.Length; i++) { if (sender.Equals(text[i])) { text[i - 4 < 0 ? i - 4 + text.Length : i - 4].Focus(); break; } } else if (e.KeyData == Keys.Down) for (int i = 0; i < text.Length; i++) { if (sender.Equals(text[i])) { text[i + 4 > text.Length - 1 ? i + 4 - text.Length : i + 4].Focus(); break; } } } 

这将允许您使用箭头键向上向左导航,它将使用选项卡修复您的问题,因此选项卡现在将向右移动并且shift + tab将返回。 此外,这个解决方案很不错,因为如果你上下移动它会像你直觉所期望的那样循环回来。 此外,如果你感觉兴奋,你现在可以对角移动。

尝试处理按键事件
→,←可以分别强制标签,移动+标签键。
只是一个粗略的想法,因为我从未尝试过这个。