Ich habe mehrere TextBoxes
und möchte den Cursor von einer TextBox
zur anderen mit den Pfeiltasten bewegen.
Wie kann ich das machen?
Es sieht so aus, als ob sich auch der Tab vertikal bewegt, was komisch ist.
Danke.
Ich habe mehrere TextBoxes
und möchte den Cursor von einer TextBox
zur anderen mit den Pfeiltasten bewegen.
Wie kann ich das machen?
Es sieht so aus, als ob sich auch der Tab vertikal bewegt, was komisch ist.
Danke.
Sie können die Methode ProcessCmdKey
des Formulars außer Kraft setzen und dort den Tastendruck und das Fokussieren auf Textfelder behandeln.
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();
//Erstellung einer zweidimensionalen Struktur zur Speicherung von Textfeldern
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);
}
///
/// Verarbeitet eine Befehlstaste.
///
/// Eine , die per Referenz übergeben wird und die die zu verarbeitende Win32-Nachricht darstellt.
/// Einer der -Werte, der die zu verarbeitende Taste darstellt.
///
/// true, wenn der Tastenanschlag vom Steuerelement verarbeitet und verbraucht wurde; andernfalls false, um eine weitere Verarbeitung zuzulassen.
///
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
//Eine Taste wurde gedrückt!
Control activeCtrl = this.ActiveControl;
TextBox txb = activeCtrl as TextBox;
//Behandeln Sie sie nur, wenn sie gesendet wurde, als ein Textfeld fokussiert war
if (txb != null)
{
int row;
int column;
//Ermitteln, welches Textfeld derzeit aktiv ist
this.GetTextBoxIndexes(txb, out row, out column);
//Indizes entsprechend Tastenanschlag ändern
if (keyData == Keys.Up)
{
row--;
}
else if (keyData == Keys.Down)
{
row++;
}
else if (keyData == Keys.Left)
{
column--;
}
else if (keyData == Keys.Right)
{
column++;
}
//Stellen Sie sicher, dass wir keinen negativen/Index außerhalb des Bereichs haben
row = Math.Abs(row + 4) % 4;
column = Math.Abs(column + 4) % 4;
//Fokussiere das angeforderte Textfeld
TextBox slected = this._textBoxes[row][column];
slected.Focus();
}
//Vergessen Sie nicht, die Kette nicht zu unterbrechen...
return base.ProcessCmdKey(ref msg, keyData);
}
///
/// Ruft die Indexe des Textfelds ab.
///
/// Das Textfeld.
/// Der aus Zeilenindex.
/// Der aus Spaltenindex.
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;
}
}
}
}
}
}
Die folgende Lösung funktioniert, wenn sich Text in den Textfeldern befindet.
Erstellen Sie zunächst einen KeyDown
-Ereignishandler:
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();
}
}
Nur aus dem Kopf kreativ erstellt. Das gibt dir genau das, was du möchtest.
Schritt 1: Erstelle eine TableLayoutPanel
und setze die Spalten auf 4 und die Zeilen auf 5. Lösche alle deine ursprünglichen Textfelder
Schritt 2: Füge dies zu deinem Code hinzu.
void tableLayoutPanel1_KeyDown(object sender, KeyEventArgs e)
{ // dies bewegt den Fokus des Kastens nach oben, unten, links oder rechts
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; }
}
}
}
Dies ermöglicht es dir, mit den Pfeiltasten nach oben, unten, links und rechts zu navigieren und behebt dein Problem mit der Tabulatortaste, sodass Tab nun nach rechts geht und Shift+Tab zurückgeht. Diese Lösung ist auch deshalb schön, weil sie es ermöglicht, dass du intuitiv erwartest, dass du beim Hoch- oder Runterscrollen wieder umschwenkst. Außerdem kannst du jetzt diagonal gehen, falls du dich verspielt fühlst.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.