web-dev-qa-db-fra.com

Afficher une fiche enfant au centre de la fiche parent en C #

Je crée un nouveau formulaire et appelle à partir du formulaire parent comme suit: 

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

J'ai besoin d'afficher le formulaire enfant au centre du parent. Donc, dans la charge de 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 renvoie une erreur car la forme parent est null. J'ai également essayé de définir la propriété Parent, mais je n'ai pas aidé. Des entrées sur ceci?

65
Newbiee

Essayer:

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

Bien sûr, l’enfant sera désormais une forme de blocage (dialogue) de la fenêtre parente. Si cela n’est pas souhaité, remplacez simplement ShowDialog par Show ..

loginForm.Show(this);

Cependant, vous aurez toujours besoin de spécifier la StartPosition.

122
Quintin Robinson

Il semble y avoir une confusion entre "parent" et "propriétaire". Si vous ouvrez un formulaire en tant que formulaire MDI, c'est-à-dire incorporé 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 à celle-ci. Le paramètre que vous pouvez transmettre à 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 centrera par rapport à son propriétaire avec un décalage, si sa position StartPosition est définie sur Manuel. Le petit offset ouvre les formulaires en mosaïque. Ceci est un avantage si le formulaire propriétaire et le formulaire appartenant ont la même taille ou si vous ouvrez plusieurs formulaires détenus.

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;
    }
}
15

En supposant que votre code s'exécute dans votre formulaire parent, vous recherchez probablement ce que vous cherchez:

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

Pour mémoire, il existe également une fonction Form.CenterToParent(), si vous avez besoin de la centrer après la création pour une raison quelconque.

10
Matthew Scharley

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 mets simplement cela dans la méthode Load du formulaire. Tout est bon.

La position de départ au centre du parent a été définie et fonctionne lorsque vous utilisez le showdialog bloquant.

8
Highflier

Lors du lancement d'un formulaire dans un formulaire MDIForm, vous devrez utiliser .CenterScreen au lieu de .CenterParent.

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

Tu en as besoin:

Remplacez-moi par this.parent, mais vous devez définir parent avant d'afficher ce formulaire.

  Private Sub ÜberToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÜberToolStripMenuItem.Click

        'About.StartPosition = FormStartPosition.Manual ' !!!!!
        About.Location = New Point(Me.Location.X + Me.Width / 2 - About.Width / 2, Me.Location.Y + Me.Height / 2 - About.Height / 2)
        About.Show()
    End Sub
4
Stefan Steiger
childform = new Child();
childform.Show(this);

En cas de charge de l'enfant

this.CenterToParent();
3

Sur le formulaire SubLogin, je voudrais exposer une méthode SetLocation afin que vous puissiez le définir à partir de votre formulaire parent:

public class SubLogin : Form
{
   public void SetLocation(Point p)
   {
      this.Location = p;
   }
} 

Ensuite, à partir de votre formulaire principal:

loginForm = new SubLogin();   
Point p = //do math to get point
loginForm.SetLocation(p);
loginForm.Show();
2
BFree

Cela fonctionne dans tous les cas, remplacez Form1 par votre formulaire principal.

Popup popup = new Popup();
popup.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
popup.Location = new System.Drawing.Point((Form1.ActiveForm.Location.X + Form1.ActiveForm.Width / 2) - (popup.Width / 2),(Form1.ActiveForm.Location.Y + Form1.ActiveForm.Height / 2) - (popup.Height / 2));
popup.Show(Form1.ActiveForm);
2
Fernando Rossato

Si vous souhaitez calculer votre propre emplacement, définissez d'abord StartPosition sur FormStartPosition.Manual

Form Child = new Form();
Child.StartPosition = FormStartPosition.Manual;
Child.Location = new Point(Location.X + (Width - Child.Width) / 2, Location.Y + (Height - Child.Height) / 2);
Child.Show(this);

Où il s’agit du formulaire principal/parent, comme Location.X.

La valeur par défaut de StartPosition est FormStartPosition.CenterParent et, par conséquent, elle modifie l'emplacement de l'enfant après l'affichage.

1
Lex van Buiten

Vous pouvez définir StartPosition dans le constructeur du formulaire enfant afin que toutes les nouvelles instances du formulaire soient centrées sur son parent:

public MyForm()
{
    InitializeComponent();

    this.StartPosition = FormStartPosition.CenterParent;
}

Bien entendu, vous pouvez également définir la propriété StartPosition dans les propriétés de Designer pour votre fiche enfant. Lorsque vous souhaitez afficher le formulaire enfant en tant que boîte de dialogue modale, définissez simplement le propriétaire de la fenêtre dans le paramètre de la méthode ShowDialog:

private void buttonShowMyForm_Click(object sender, EventArgs e)
{
    MyForm form = new MyForm();
    form.ShowDialog(this);
}
0
iCode

Le parent n'est probablement pas encore défini lorsque vous essayez d'y accéder.

Essaye ça:

loginForm = new SubLogin();
loginForm.Show(this);
loginForm.CenterToParent()
0
jean

Créez un Windows Form, puis mettez l’option correspondante: CenterParent puis utilisez ce code:

yourChildFormName x = new yourChildFormName();
x.ShowDialog();
0
Hessy SharpSabre

Si vous devez centrer votre childForm, à partir de childForm, le code ressemblera à ceci. Ce code est dans le childForm.cs 

this.Show(parent as Form);    // I received the parent object as Object type
this.CenterToParent();
0
Yousuf Azad

Si un formulaire de fenêtre (formulaire enfant) est ouvert depuis un nouveau fil de la fenêtre principale (formulaire parent), il est alors impossible de maintenir la sous-fenêtre au centre de la fenêtre principale. Par conséquent, nous devons fixer la position de la sous-fenêtre manuellement en: moyennes des coordonnées X et Y.

Dans les propriétés de Subwindow, changez le "StartPosition" en "Manual"

code dans la fenêtre principale

private void SomeFunction()
{
    Thread m_Thread = new Thread(LoadingUIForm);
    m_Thread.Start();
    OtherParallelFunction();
    m_Thread.Abort();
}

private void LoadingUIForm()
{
    m_LoadingWindow = new LoadingForm(this);
    m_LoadingWindow.ShowDialog();
}

code dans la sous-fenêtre pour définir sa propre position à l'aide de la position actuelle du parent ainsi que de la taille

public LoadingForm(Control m_Parent)
{
   InitializeComponent();
   this.Location = new Point( m_Parent.Location.X+(m_Parent.Size.Width/2)-(this.Size.Width/2),
                              m_Parent.Location.Y+(m_Parent.Size.Height/2)-(this.Size.Height/2)
                            );
}

Ici, les coordonnées du centre du parent sont calculées et la sous-fenêtre est conservée exactement au centre du parent en calculant son propre centre par (this.height/2) et (this.width/2), cette fonction peut être en outre pris pour les événements parents relocalisés aussi.

0
Garuda Prasad K