2012-08-23 1 views
0

permet de dire il y a deux contrôles qui se chevauchent:Gardez un contrôle sur une autre toujours sous Windows formes .Net

  • Contrôle A
  • contrôle B

Je veux garder le contrôle sur un contrôle B dans toutes les situations.

L'ordre z du contrôle B peut changer dynamiquement soit en appelant BringToFront() soit en définissant son index en tant que parent en appelant Parent.SetChildIndex(ControlB, 0). Donc, chaque fois que cela arrive, je veux que Control A arrive devant ControlB.

Je cherchais un événement qui se produit lorsque l'ordre z est changé, de sorte que je pourrais mettre le contrôle A à l'avant. Y a-t-il un tel événement? ou il y a un moyen de le faire?

+0

Que diriez-vous http://stackoverflow.com/questions/4007663/intercepting-the-value -change-of-setchildindex – stuartd

+0

L'événement paint de parent se produit-il lorsque l'ordre z de son contrôle enfant change? Cela se produit-il pour le contrôle dont l'ordre z a changé? – Brij

+0

Le contrôle (et d'autres contrôles affectés par le changement) peut avoir besoin d'être repeint, donc oui .. – stuartd

Répondre

2

Pas un fan de spammer des choses sur Paint Events. D'autant plus que WM_PAINT ne sera pas envoyé lorsque le contrôle est hors écran, donc les actions peuvent ne pas se produire aux heures auxquelles votre code les attend.

Une façon beaucoup plus contrôlée de le faire est de gérer lorsque la position des contrôles change.

Changer votre contrôle à tirer de cette (changement de classe de base pour tout ce que vous utilisez) et définissez le champ:

firstControl.ChildControl = secondControl; 

public class AlwaysParentingControl : TextBox 
{ 
    private const Int32 WM_WINDOWPOSCHANGED = 0x47; 
    public Control ChildControl { get; set; } 

    protected override void WndProc(ref Message m) 
    { 
     if(m.Msg == WM_WINDOWPOSCHANGED && ChildControl != null) 
      ChildControl.BringToFront(); 

     base.WndProc(ref m); 
    } 
} 
+0

Merci. C'est la bonne solution. – Brij

Questions connexes