Maison >développement back-end >Tutoriel C#.Net >Deux méthodes pour changer le focus de contrôle à l'aide des touches fléchées et de la touche Entrée en C#
Environnement : il y a TextBox, ComboBox et d'autres contrôles sur l'interface.
Il n'est pas recommandé d'utiliser à la fois les touches fléchées gauche et droite pour changer de focus, sinon il vous sera gênant de modifier la position du caractère du curseur dans la TextBox.
Méthode 1 : Méthode stupide, le traitement des événements doit être enregistré séparément pour chaque contrôle
Prenons TextBox comme exemple, le code est le suivant :
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 }
Méthode 2 : Méthode simple, pas besoin d'enregistrer le traitement des événements séparément pour chaque contrôle, ajoutez simplement le code suivant à la classe du formulaire :
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 }
À ce stade, la fonction de changement de focus de contrôle a été implémentée. Il existe désormais deux contrôles ComboBox cmbMeas et cmbRemark sur l'interface du formulaire. être soumis lorsque vous appuyez sur Entrée. Au lieu de changer de focus, que dois-je faire ? Ensuite, vous devez déterminer si le contrôle qui a actuellement le focus est cmbMeas ou cmbRemark. Le code ci-dessus doit être légèrement modifié. Le code spécifique est le suivant :
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 }
Instructions :
La méthode Control.FromHandle
renvoie le contrôle actuellement associé au handle spécifié ; si aucun contrôle avec le handle spécifié n'est trouvé, une référence nulle est renvoyée.
Méthode Control.FromChildHandle
Si vous devez renvoyer un contrôle avec plusieurs handles, vous devez utiliser la méthode FromChildHandle.
Cette méthode recherche la chaîne parent du handle de fenêtre jusqu'à ce qu'elle trouve le handle associé au contrôle. Cette méthode est plus fiable que la méthode FromHandle car elle renvoie correctement les contrôles avec plusieurs poignées.
Pour les contrôles définis par l'utilisateur, la méthode FromChildHandle doit être utilisée.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!