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