web-dev-qa-db-ja.com

コードを使用してWindowsフォームフォームのStartPositionをどのように設定しますか?

コードを使用してWindowsフォームフォームのStartPositionを設定する方法はありますか?私が何をしようとしても、StartPostionがデフォルトになるようです。

これが私が表示するフォームで行っていることです:

_    public DealsForm()
    {
        InitializeComponent();
        this.StartPosition = FormStartPosition.CenterParent;
    }
_

フォームを表示するために私が行っていることは次のとおりです。

_    private void nvShowDeals_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    {
        DealsForm frm = new DealsForm();

        frm.DataSource = this.Deals;

        frm.Show(this);
    }
_

私は上記の各方法に以下を入れてみましたが、役に立ちませんでした。

_this.StartPosition = FormStartPosition.CenterParent;
_

プロパティエディタを介して設定した場合...完全に機能しますが、本当にコードを介して設定したいと思います。

簡単なはずです...しかし、私の人生のために私はそれを理解することができないようです...多分私はもっとカフェインが必要です。

更新:

ShowDialog()を実行して親を渡すと、それは機能します...しかし、実際にはダイアログとして表示したくありません。

16
mattruma

ShowDialog()を実行し、親を渡すと機能します...しかし、実際にはダイアログとして表示したくありません。

ShowDialogはfrm.Parent == nvShowDeals.Parentを設定するため、これは正しいです。
。Show()を使用しているため、frm.Parent == nullであるため、FormStartPosition.CenterParentは無視されます。

したがって、この機能を実行するには、次の変更を加えます。

public DealsForm()
{
    InitializeComponent();
    //this.StartPosition = FormStartPosition.CenterParent;
}

//DealsForm_Load Event
private void DealsForm_Load(object sender, EventArgs e)
{
    this.Location = this.Owner.Location;  //NEW CODE
}

そしてここで私は次の変更を行います:

private void nvShowDeals_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    DealsForm frm = new DealsForm();

    frm.DataSource = this.Deals;
    frm.StartPosition = FormStartPosition.Manual; //NEW CODE
    frm.Show(this);
}
11

多分あなたは一人ではありません。多分あなたは正気ではありません。これを読んでください(Microsoft Connectカスタマーフィードバック):

WindowsフォームのStartPositionプロパティは.ShowDialogメソッドでのみ機能し、.Showメソッドでは機能しません

顧客: "WindowsフォームのStartPositionは.ShowDialogメソッドでのみ機能し、.Showメソッドでは機能しません。注:簡単なコードと結果の画像も添付しました。"

MS: "残念ながら、この特定の問題は将来のリリースで修正できません。ここでの修正は、WinForms 1、1.1、および2の動作に重大な変更を加えるためです"

18
splattne

これを行うには、Form_Loadイベントでthis.CenterToParent()を呼び出します(親が実際にわかっている場合)。 Show(form)が呼び出されたときに設定された親であるため、コンストラクターでこれを呼び出さないでください。

private void myForm_Load(object sender, EventArgs e)
{
    CenterToParent();
}

私はこのスレッドが古いことを知っていますが、それはかなり簡単に答えることができるので、うまくいけば、それに出くわした他の人が簡単な解決策を見つけるのを手伝ってください。

6
Si Fitz

.Show呼び出しの親を中心にするには、これが私がしなければならなかったことです。

childForm.Location = new Point(
    (parentForm.Location.X + parentForm.Width / 2) - (childForm.Width / 2), 
    (parentForm.Location.Y + parentForm.Height / 2) - (childForm.Height / 2));
childForm.StartPosition = FormStartPosition.Manual;
4
Justin Pihony

呼び出し元のメソッドでプロパティを設定しようとしましたか?

private void nvShowDeals_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    DealsForm frm = new DealsForm();

    frm.DataSource = this.Deals;

    // Insert this
    frm.StartPosition = FormStartPosition.CenterParent;

    frm.Show(this);
}
1
splattne
public DealsForm()
{
    InitializeComponent();
    this.StartPosition = FormStartPosition.CenterParent;       
}

InitializeComponent()の前に配置してみてください。 InitializeComponentの後ですでに手遅れになっている可能性があります(フォームがすでに起動されていて、StatPositionの設定が遅すぎる可能性があります)。

更新

私はちょうど書いた:

public Form1()
{
    InitializeComponent();
    this.StartPosition = FormStartPosition.CenterScreen;
}

そして:

private void button1_Click(object sender, EventArgs e)
{
    Form1 f = new Form1();
    f.Show();
}

VSプロジェクト(新品)で、form2のボタンをクリックすると、画面の中央にフォームが開きます。あなたは親と同じことをすることができます...

1

DealsForm.Designer.csを確認し、そこにStartPositionを設定する行を削除して、そのまま実行することをお勧めします。

または、代わりにフォームのLoadイベントまたはShownイベントで設定してみてください。

0
Jon Grant