2009-11-13 8 views
1

Je suis en train d'écrire un UserControl qui agira un peu comme une liste déroulante, essentiellement une zone de texte avec une zone de liste qui apparaît en dessous ...Garder une fenêtre en face d'un autre

Si le contrôle est au fond de sa forme parente, je ne veux pas que la liste soit coupée par le bas des formulaires, donc je ne peux pas avoir cette listbox comme enfant du formulaire parent. J'ai besoin de créer un nouveau formulaire sans bordure contenant la liste et affichez ceci dans la bonne position.

Je peux le faire très bien, le problème vient avec le tri de l'ordre z des formulaires. J'ai besoin de ce nouveau formulaire pour apparaître au-dessus du formulaire parent en tout temps. Mais je ne veux pas que cette fenêtre apparaisse au-dessus de toutes les fenêtres qui sont au-dessus du formulaire parent ... quel est le paramétrage de la forme.TopMost me le donnerait.

Existe-t-il un autre moyen de le faire? Comment les ComboBox réussissent-ils à obtenir ce comportement?

Merci

Répondre

5

Lorsque vous appelez form.Show(), passent le propriétaire du contrôle de l'utilisateur (la forme actuelle) comme paramètre propriétaire. Ce code n'est pas parfait, mais vous aurez l'idée.

class MyControl : UserControl 
{ 
    private DropDownForm form = new DropDownForm(); 

    public MyControl() 
    { 
     form.FormClosed += dropdownform_closed; 
    } 

    private void MethodThatShowsDropdown() 
    { 
     form.AddData(GetTheData()); 
     form.Show(this.Owner); // Or is it "this.Parent"? I can never remember... 
    } 

    private void dropdownform_closed(object sender, EventArgs e) 
    { 
     DoSomething(form.SelectedValue); 
    } 
} 
+1

En outre, vous pouvez définir la propriété Owner sur un formulaire au cas où votre code ne l'indiquerait pas directement. – Marek

+0

Lorsque j'exécute ce code, le formulaire apparaît et disparaît. Pourquoi ne pas juste '(nouveau DropDownForm()). Montrer (ceci)'? – jheddings

+0

Eek - oups. Le formulaire est disposé (et donc fermé) immédiatement. Je vais changer l'exemple ... –

0

Je ne suis pas sûr que cela fonctionnerait pour votre application, mais en utilisant ShowDialog() pour afficher votre « sous forme de liste » garderait au bon endroit. L'inconvénient est qu'il ne vous permettra pas de retourner au formulaire parent tant que la liste est ouverte.

0

Vous devez uniquement fournir le formulaire parent lors de l'appel de ShowModalDialog ou Show. Lorsque vous faites cela, le formulaire est un enfant du premier et le chevauchera toujours dans l'ordre z.

Questions connexes