2010-03-23 7 views
1

Imaginez que j'ai un formulaire avec 9 contrôles (TabbedStuffControl) dans une tuile 3x3, et ces contrôles contiennent TabControls contenant un autre contrôle (StuffControl) avec ListBoxes et TextBoxes.Comment faire pour que le contrôle parent sache que son enfant a le focus?

Je voudrais savoir un moyen approprié de laisser TabbedStuffControl que son enfant a reçu un focus? par exemple. l'utilisateur clique dans une zone de texte de StuffControl ou fait glisser quelque chose dans la zone de liste de StuffControl. Finalement, le formulaire doit savoir quel TabbedStuffControl est actif

Dois-je brancher événement GotFocus de TextBoxes et ListBoxes et TabControls, un autre événement, puis il transmet pour laisser enfin savoir qui forme se concentrer? Je pense qu'il devrait y avoir un moyen plus simple - que TabbedStuffControl sache que son enfant ait le focus, donc il n'y aurait qu'un seul endroit dans le code que je connecte.

Merci.

Répondre

2

Utilisation de l'événement Entrée (mieux alors GotFocus) est certainement une bonne approche. Abonnez un gestionnaire pour tous les contrôles, puis recherchez le parent du contrôle dans le gestionnaire d'événements Entrée. Cet exemple de code illustre l'approche:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     wireEnter(this.Controls); 
    } 
    private void wireEnter(Control.ControlCollection ctls) { 
     // Hook Enter event for all controls 
     foreach (Control ctl in ctls) { 
     ctl.Enter += ctl_Enter; 
     wireEnter(ctl.Controls); 
     } 
    } 

    TabbedStuffControl mParent; 

    private void ctl_Enter(object sender, EventArgs e) { 
     // Find parent 
     Control parent = (sender as Control).Parent; 
     while (parent != null && !(parent is TabbedStuffControl)) parent = parent.Parent; 
     if (parent != mParent) { 
     // Parent changed, do something. Watch out for null 
     //.... 
     mParent = parent as TabbedStuffControl; 
     } 
    } 
    } 
+0

Pensez-vous que le câblage de chaque contrôle est un peu trop? Je me demandais à quoi ressemblerait la performance. – Icono123

+0

@Icono: Les événements de mise au point se produisent en "temps humain". Votre utilisateur ne remarquera * jamais * les 20 nanosecondes nécessaires pour déclencher l'événement. Un seul tirera, pas tous. –

+0

fonctionne comme un charme! – Axarydax

0

Vous devez utiliser COM:

// Import GetFocus() from user32.dll 
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)] 
internal static extern IntPtr GetFocus(); 

protected Control FocusControl 
{ 
    get 
    { 
     Control focusControl = null; 
     IntPtr focusHandle = GetFocus(); 

     if (focusHandle != IntPtr.Zero) 
      // returns null if handle is not to a .NET control 
      focusControl = Control.FromHandle(focusHandle); 

     return focusControl; 
    } 
} 
+0

merci, mais c'est une propriété qui me dirait quel contrôle a le focus. Ce que je veux faire, c'est de savoir * quand * quelqu'un s'est concentré, alors j'ai besoin d'un événement. – Axarydax

+0

Cela n'a rien à voir avec COM, il s'appelle P/Invoke ... –

+0

Simon a raison. ActiveControl est l'équivalent .NET. –

Questions connexes