我有几个,我希望光标使用箭头键TextBoxes
从一个移动到另一个。TextBox
我怎样才能做到这一点?
看起来像这样,水龙头也垂直移动,这很奇怪。
谢谢。
我有几个,我希望光标使用箭头键TextBoxes
从一个移动到另一个。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<TextBox[]> _textBoxes;
public Form1()
{
InitializeComponent();
//Getting a 2 dimentional structure to hold textboxes
this._textBoxes= new List<TextBox[]>();
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);
}
/// <summary>
/// Processes a command key.
/// </summary>
/// <param name="msg">A <see cref="T:System.Windows.Forms.Message"/>, passed by reference, that represents the Win32 message to process.</param>
/// <param name="keyData">One of the <see cref="T:System.Windows.Forms.Keys"/> values that represents the key to process.</param>
/// <returns>
/// true if the keystroke was processed and consumed by the control; otherwise, false to allow further processing.
/// </returns>
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);
}
/// <summary>
/// Gets the text box indexes.
/// </summary>
/// <param name="txb">The texbox.</param>
/// <param name="row">The out row index.</param>
/// <param name="column">The out column index.</param>
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 步:将此添加到您的代码中。
void tableLayoutPanel1_KeyDown(object sender, KeyEventArgs e)
{ // this moves the box focus up down left or right
if (e.KeyData == Keys.Left)
{
for (int i = 0; i < text.Length; i++)
{
if (sender.Equals(text[i]))
{ text[i - 1 < 0 ? text.Length - 1 : i - 1].Focus(); break; }
}
}
else if (e.KeyData == Keys.Right)
{
for (int i = 0; i < text.Length; i++)
{
if (sender.Equals(text[i]))
{ text[i + 1 > 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; }
}
}
}
这将允许您使用箭头键从左到右向上导航,它将解决您与选项卡有关的问题,因此Tab现在将向右移动,Shift+tab将返回。此外,这个解决方案很好,因为如果你上升或下降,它会像你直觉预期的那样循环回来。此外,如果您感到兴奋,您现在可以对角线移动。
尝试处理按键事件
→、←可以分别强制tab、shift+tab按键。
只是一个粗略的想法,因为我从未尝试过。