2009-06-03 13 views
56

で親フォームの中央に子フォームを表示:私は新しいフォームを作成し、次のように親フォームから呼び出すC#の

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

私は親の中央で子フォームを表示する必要があります。だから、子フォームのロード中に私がfoll行います `

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

をしかし、親フォームがnullであるとして、これはエラーを投げています。私はParentプロパティも設定しようとしましたが、助けにはなりませんでした。これに関するすべての入力?

+0

どのようなエラーが表示されますか? – Joseph

答えて

113

試してみてください。

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

もちろんそれはそれからちょうどShowShowDialogを置き換えたくない場合は、今、親ウィンドウのブロッキングフォーム(ダイアログ)となりますため、子...

loginForm.Show(this); 

ただし、StartPositionを指定する必要があります。

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

を次に、メインフォームから:あなたの親フォームからそれを設定することができるように、私はsetLocationメソッドを公開しますSubLoginフォームに

+12

デザイナでLoginFormのそのプロパティを設定することもできます。 –

+37

loginForm.StartPosition = FormStartPosition.CenterParentとloginForm.Show(this);フォームを中央に配置しません。 – Pedro77

2

あなたのコードを仮定し

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

がありますあなたの親のフォームの中で実行されている場合は、おそらくあなたが探しているものです:

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

レコードの場合は、何らかの理由で作成後にセンターに配置する必要がある場合は、Form.CenterToParent()機能もあります。

0

親にアクセスしようとすると、おそらくまだ設定されていません。

はこれを試してみてください:

loginForm = new SubLogin(); 
loginForm.Show(this); 
loginForm.CenterToParent() 
+2

CenterToParentはパブリックメソッドではありません。 このメソッドをコントロールからパブリックメソッドとして委譲する必要があります。 – Jarek

4

あなたはこれを必要とする:

this.parentで私を交換していますが、そのフォームを表示する前に親を設定する必要があります。

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 
13

「親」と「所有者」の間に混乱があるようです。 MDI形式、つまり別のフォームの中に埋め込まれたフォームを開くと、この周囲のフォームが親フォームになります。 FormStartPosition.CenterParentという値を持つフォームプロパティStartPositionは、このプロパティを参照します。 Showメソッドに渡す可能性のあるパラメータは、親ではなく所有者です。これはfrm.StartPosition = FormStartPosition.CenterParentが期待通りに機能しない理由です。

フォームに配置された次のコードは、StartPositionがManualに設定されている場合は、オフセットを使用して所有者に対して中心に配置されます。小さなオフセットは、タイル状にフォームを開きます。これは、オーナーと所有フォームが同じサイズの場合、または複数の所有フォームを開いた場合に有利です。

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

私は 'CenterParent'も、少なくとも私が使用している.netのバージョンでは、' Owner'に対して相対的に動作することを確信しています。 – binki

7

あなたが.CenterScreen代わりの.CenterParentを使用する必要がありますMDIFormフォーム内のフォームを起動します。

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

なぜこれを使用しないのですか?

LoginForm.WindowStartupLocation = Windows.WindowStartupLocation.CenterOwner 

(vb.net)

0

それのためのオプションを入れて、Windowsフォームを作成します。CenterParentは、このコードを使用します。

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

あなたがあなた自身の位置を計算する場合は、最初FormStartPosition.ManualStartPositionを設定します。

これがためにメイン/親である
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); 

m、Location.Xと同じです

StartPositionのデフォルト値はFormStartPosition.CenterParentであるため、表示後に子の場所が変更されます。

+0

この回答は私には役に立ちます。ありがとう。 –

0

childFormを中央に配置する必要がある場合は、childFormからコードを作成します。このコードは、私がform.ShowDialog();を使用しない限り、親の設定が私のために動作しませんchildForm.csに

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

です。

form.Show();またはform.Show(this);を使用する場合は、使用するまで何も働かないthis.CenterToParent();。 私はちょうどそれをLoadフォームのメソッドに入れます。すべてが良いです。

親の中心までの開始位置が設定され、ブロッキング・ショーダイアグラムを使用するときに機能します。

2
イベントchildform負荷で
childform = new Child(); 
childform.Show(this); 

this.CenterToParent(); 
0

その親にフォームのすべての新しいインスタンスを中心に取得するように、子フォームのコンストラクタで開始位置を設定することができます。

public MyForm() 
{ 
    InitializeComponent(); 

    this.StartPosition = FormStartPosition.CenterParent; 
} 

もちろん、子フォームのDesignerプロパティでStartPositionプロパティを設定することもできます。あなただけのShowDialogメソッドのパラメータでウィンドウの所有者を設定し、モーダルダイアログとして子フォームを表示したいときは:

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

それはすべてのケースで動作し、メインフォームのために、Form1を交換します。

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); 
関連する問題