Umgebung: Auf der Benutzeroberfläche befinden sich TextBox, ComboBox und andere Steuerelemente.
Es wird nicht empfohlen, zum Wechseln des Fokus sowohl die linke als auch die rechte Pfeiltaste zu verwenden, da es sonst für Sie unpraktisch wäre, die Zeichenposition des Cursors in der TextBox zu ändern.
Methode 1: Dumme Methode, die Ereignisverarbeitung muss für jedes Steuerelement separat registriert werden
Nehmen Sie TextBox als Beispiel, der Code lautet wie folgt:
1 private void textbox_KeyDown(object sender, KeyEventArgs e) 2 { 3 if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter) 4 { 5 e.SuppressKeyPress = true; 6 System.Windows.Forms.SendKeys.Send("{Tab}"); 7 } 8 else if (e.KeyCode == Keys.Up) 9 { 10 e.SuppressKeyPress = true; 11 System.Windows.Forms.SendKeys.Send("+{Tab}"); 12 } 13 }
Methode 2: Einfache Methode, keine Notwendigkeit, die Ereignisverarbeitung für jedes Steuerelement separat zu registrieren, fügen Sie einfach den folgenden Code zur Formularklasse hinzu:
1 //上、下方向键,及回车键切换控件焦点 2 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 3 { 4 Keys key = (keyData & Keys.KeyCode); 5 if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter) 6 { 7 System.Windows.Forms.SendKeys.Send("{Tab}"); 8 return true; 9 } 10 else if (e.KeyCode == Keys.Up) 11 { 12 System.Windows.Forms.SendKeys.Send("+{Tab}");13 return true; 14 } 15 return base.ProcessCmdKey(ref msg, keyData);16 }
Zu diesem Zeitpunkt wurde die Funktion zum Wechseln des Steuerelementfokus implementiert. Es gibt zwei ComboBox-Steuerelemente, cmbMeas und cmbRemark Was soll ich tun, anstatt den Fokus zu wechseln? Dann müssen Sie feststellen, ob das Steuerelement, das derzeit den Fokus hat, cmbMeas oder cmbRemark ist. Der spezifische Code lautet wie folgt:
1 //API声明:获取当前焦点控件句柄 2 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)] 3 internal static extern IntPtr GetFocus(); 4 5 //获取当前拥有焦点的控件 6 private Control GetFocusedControl() 7 { 8 Control focusedControl = null; 9 // To get hold of the focused control:10 IntPtr focusedHandle = GetFocus();11 if (focusedHandle != IntPtr.Zero)12 //focusedControl = Control.FromHandle(focusedHandle);13 focusedControl = Control.FromChildHandle(focusedHandle);14 return focusedControl ;15 }16 17 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)18 {19 Keys key = (keyData & Keys.KeyCode);20 Control ctrl = GetFocusedControl();21 if (e.KeyCode == Keys.Down || (key == Keys.Enter && ctrl.Name != "cmbMeas" && ctrl.Name != "cmbRemark")) 22 { 23 System.Windows.Forms.SendKeys.Send("{Tab}"); 24 return true; 25 } 26 else if (e.KeyCode == Keys.Up) 27 { 28 System.Windows.Forms.SendKeys.Send("+{Tab}");29 return true; 30 } 31 return base.ProcessCmdKey(ref msg, keyData);32 }
Anweisungen:
Control.FromHandle-Methode
gibt das aktuell mit dem angegebenen Handle verknüpfte Steuerelement zurück. Wenn kein Steuerelement mit dem angegebenen Handle gefunden wird, wird ein Nullverweis zurückgegeben.
Control.FromChildHandle-Methode
Wenn Sie ein Steuerelement mit mehreren Handles zurückgeben müssen, sollten Sie die Methode FromChildHandle verwenden.
Diese Methode durchsucht die übergeordnete Kette des Fensterhandles, bis sie das mit dem Steuerelement verknüpfte Handle findet. Diese Methode ist zuverlässiger als die Methode FromHandle, da sie Steuerelemente mit mehreren Handles korrekt zurückgibt.
Für benutzerdefinierte Steuerelemente sollte die FromChildHandle-Methode verwendet werden.
Das obige ist der detaillierte Inhalt vonZwei Möglichkeiten, den Fokus eines Steuerelements zwischen den Pfeiltasten und der Eingabetaste in C# zu wechseln. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!