2010-12-13 6 views
6

J'ai windows C# forme application avec plusieurs zones de texte et un bouton. Je voudrais trouver la boîte de texte qui a l'accent et faire quelque chose avec elle. J'ai écrit le code suivant mais bien sûr cela ne marchera pas car le bouton sera mis au point dès qu'il sera pressé.Découvrez le contrôle avec la dernière mise au point

private void button1_MouseDown(object sender, MouseEventArgs e) 
{ 
    foreach (Control t in this.Controls) 
    { 
     if (t is TextBox) 
     { 
      if (t.Focused) 
      { 
       MessageBox.Show(t.Name); 
      } 
     } 
    } 
} 
+1

bouton peut également se concentrer par la presse Tab. – 26071986

Répondre

15

Il n'y a pas construit dans la propriété ou la fonctionnalité pour garder la trace du précédent contrôle ciblé. Comme vous l'avez mentionné, chaque fois que le bouton est cliqué, il prendra la mise au point. Si vous voulez garder une trace de la zone de texte qui était focalisée avant cela, vous allez devoir le faire vous-même.

Une façon de faire serait d'ajouter une variable au niveau de la classe à votre formulaire qui contient une référence au contrôle de zone de texte se concentre actuellement:

private Control _focusedControl; 

Et puis en cas GotFocus pour chacun de vos contrôles de zone de texte, vous voulez bien mettre à jour la variable _focusedControl avec cette zone de texte:

private void TextBox_GotFocus(object sender, EventArgs e) 
{ 
    _focusedControl = (Control)sender; 
} 

maintenant, chaque fois qu'un bouton est cliqué (pourquoi utilisez-vous l'événement MouseDown comme indiqué dans votre question au lieu de la butto ? Événement Click de n), vous pouvez utiliser la référence au contrôle de la zone de texte précédemment focalisé qui est enregistré dans la variable de niveau classe comme bon vous semble:

private void button1_Click(object sender, EventArgs e) 
{ 
    if (_focusedControl != null) 
    { 
     //Change the color of the previously-focused textbox 
     _focusedControl.BackColor = Color.Red; 
    } 
} 
3

Vous pourriez peut-être souscrire à l'événement GotFocus de vos zones de texte, stocker la zone de texte (vous obtiendriez avec le paramètre de l'expéditeur) dans un champ, et utiliser ce champ lorsque vous appuyez sur le bouton?

2

Je voudrais utiliser l'événement button1_MouseHover. Lorsque cet événement est déclenché, ActiveControl va jusqu'au contrôle précédent, que vous pouvez stocker comme _focusedControl.

Bien sûr, cela ne fonctionnera pas si les onglets utilisateur du bouton.