83 votes

Afficher un formulaire enfant au centre du formulaire parent en C#

Je crée un nouveau formulaire et j'appelle le formulaire parent comme suit :

loginForm = new SubLogin();   
loginForm.Show();

J'ai besoin d'afficher le formulaire enfant au centre du formulaire parent. Donc, dans le chargement du formulaire enfant, je fais ce qui suit:`

Point p = new Point(this.ParentForm.Width / 2 - this.Width / 2, this.ParentForm.Height / 2 - this.Height / 2);
this.Location = p;

Mais cela provoque une erreur car le formulaire parent est nul. J'ai également essayé de définir la propriété Parent, mais cela n'a pas aidé. Des suggestions à ce sujet ?

140voto

Quintin Robinson Points 41988

Essayez :

loginForm.StartPosition = FormStartPosition.CenterParent;
loginForm.ShowDialog(this);

Bien entendu, la fenêtre enfant sera désormais un formulaire bloquant (dialogue) de la fenêtre parentale. Si vous ne le souhaitez pas, remplacez simplement ShowDialog avec Show ..

loginForm.Show(this);

Vous devrez néanmoins spécifier la position de départ.

30voto

Highflier Points 311

Le paramètre de parent ne fonctionne pas pour moi, sauf si j'utilise form.ShowDialog(); .

Lors de l'utilisation de form.Show(); ou form.Show(this); Rien ne fonctionnait jusqu'à ce que je l'utilise, this.CenterToParent(); . Je viens de le mettre dans le Chargement du formulaire. Tout va bien.

La position de départ au centre du parent a été définie et fonctionne lors de l'utilisation du blocage du dialogue de présentation.

20voto

Il semble y avoir une confusion entre "Parent" et "Propriétaire". Si vous ouvrez un formulaire en tant que formulaire MDI, c'est-à-dire imbriqué dans un autre formulaire, le formulaire qui l'entoure est le parent. La propriété de formulaire StartPosition avec la valeur FormStartPosition.CenterParent fait référence à ce dernier. Le paramètre que vous pouvez passer à la méthode Show est le Propriétaire, pas le Parent ! C'est pourquoi frm.StartPosition = FormStartPosition.CenterParent ne fonctionne pas comme prévu.

Le code suivant, placé dans un formulaire, le centre par rapport à son propriétaire avec un certain décalage, si sa PositionDépart est définie sur Manuel. Ce petit décalage permet d'ouvrir les formulaires en mosaïque. C'est un avantage si le propriétaire et le formulaire possédé ont la même taille ou si vous ouvrez plusieurs formulaires possédés.

protected override void OnShown(EventArgs e)
{
    base.OnShown(e);
    if (Owner != null && StartPosition == FormStartPosition.Manual) {
        int offset = Owner.OwnedForms.Length * 38;  // approx. 10mm
        Point p = new Point(Owner.Left + Owner.Width / 2 - Width / 2 + offset, Owner.Top + Owner.Height / 2 - Height / 2 + offset);
        this.Location = p;
    }
}

13voto

Matthew Scharley Points 43262

En supposant que votre code s'exécute à l'intérieur de votre formulaire parent, quelque chose comme ceci est probablement ce que vous recherchez :

loginForm = new SubLogin();
loginForm.StartPosition = FormStartPosition.CenterParent
loginForm.Show(this);

Pour mémoire, il existe également un Form.CenterToParent() si vous devez le centrer après la création pour une raison quelconque.

9voto

timothy Points 121

Lors du lancement d'un formulaire à l'intérieur d'un MDIForm vous devrez utiliser .CenterScreen au lieu de .CenterParent .

FrmLogin f = new FrmLogin();
f.MdiParent = this;
f.StartPosition = FormStartPosition.CenterScreen;
f.Show();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X