2010-11-17 7 views
1

Je deux formulaires, Form1, et un UserControl qui héberge Form2. Dans ce UserControl sur Form1, j'appelle Form2.Show();. J'ai également essayé Form2.Show(this);. De toute façon, l'accent n'est pas donné au formulaire. Je dois cliquer une fois dans le nouveau formulaire pour le mettre en évidence, puis je peux cliquer sur les éléments de ce formulaire. Je pensais que le contrôle revenait à mon contrôle/formulaire principal, et que le focus se perdait. Donc j'attends que Form2 soit fermé via:Afficher un formulaire via Form.Show n'a pas de focus?

 while (form2.Visible == true) 
     { 
      System.Threading.Thread.Sleep(100); 
      Application.DoEvents(); 
     }  

Cela semble fonctionner. Cependant, après avoir fermé le formulaire, l'inverse est vrai. Form1 n'est pas activé (même si j'appelle this.Focus()) jusqu'à ce que je clique une fois dans la fenêtre principale du formulaire.

Toutes les idées pour gérer cela correctement. Je veux montrer une forme enfant (modeless) et immédiatement pouvoir cliquer dessus, et quand ce formulaire est fermé, être immédiatement capable de revenir sur le formulaire parent.

+1

Un contrôle utilisateur qui * héberge * un formulaire? Est-ce juste en le créant et en appelant Show() ou agit-il réellement en tant que parent pour le formulaire avec la propriété TopLevel du formulaire définie sur false? Afficher le code de contrôle de l'utilisateur. –

+0

Il agit juste comme un parent. C'est un ComboBox où je "laisse tomber" mon propre ListView plutôt que le dialogue standard. Ce ListView est hébergé dans un formulaire (je ne pouvais pas trouver un moyen d'afficher directement le ListView.). Je vais regarder dans l'ajout du UserControl. – esac

Répondre

0

Cela vient du fait que je remplaçais WndProc pour afficher le formulaire. Lorsque j'ai reçu le message CBN_DROPDOWN, j'afficher le formulaire. J'ai corrigé cela en appelant à la place la méthode qui montre le formulaire et elle l'a corrigé.

case CBN_DROPDOWN: 
    Invoke(new MethodInvoker(Show_DropDown)); 
    return; 
1

Vous devriez probablement utiliser .ShowDialog(), cela peut également être étendu pour donner votre réponse si l'utilisateur a correctement effectué ou interrompu le fonctionnement de Form2. Ceci fait que le formulaire est verrouillé au premier plan et interrompt l'exécution du code sur le premier formulaire jusqu'à la fermeture de ce formulaire.

+0

Le problème est que je veux que l'utilisateur puisse agir sur le formulaire principal, et quand ils le font, il fermera ce formulaire. Un peu comme un Popup. – esac

1

utilisation this.Activate(); en place de this.Focus();

0

Je ne sais pas je suivre complètement, mais de votre UC essayez d'ouvrir Form2 comme ceci:

form2.Show(Parent); 

Cela devrait spécifier le formulaire parent de l'UC en tant que propriétaire de form2.