3 Stimmen

Wie bewegt man den Cursor zwischen Textfeldern mithilfe der Pfeiltasten?

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.

Bildbeschreibung hier eingeben

4voto

Avi Turner Punkte 9662

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

3voto

mck Punkte 968

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

2voto

CodeCamper Punkte 5904

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.

0voto

Jawahar Punkte 1

Versuchen Sie, das keypress Ereignis zu behandeln
, kann die Tabulatortaste, Umschalt+Tabulatortaste entsprechend erzwingen.
Nur eine grobe Vorstellung, da ich dies noch nie ausprobiert habe.

CodeJaeger.com

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.

Powered by:

X