Подтвердить что ты не робот

Как установить форму StartPosition формы Windows Forms с помощью кода?

Есть ли способ установить форму StartPosition формы Windows Forms с помощью кода? Кажется, все, что я пытаюсь получить в 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() и передаю родительский объект, он работает... но я действительно не хочу показывать его как диалог.

4b9b3361

Ответ 1

Если я делаю 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);
}

Ответ 2

Возможно, вы не одиноки. Может быть, ты не сумасшедший. Прочтите это (обратная связь с клиентами Microsoft Connect):

Свойство Windows Form StartPosition работает только для метода .ShowDialog, а не для .Show-метода

Клиент: "Windows Form StartPosition работает только для метода .ShowDialog, а не для .Show-метода. Примечание: я также добавил простой код и изображения результатов".

MS: "К сожалению, мы не сможем исправить эту конкретную проблему в будущей версии, так как исправление здесь было бы нарушением изменения поведения WinForms 1, 1.1 и 2"

Ответ 3

Вы можете сделать это, вызвав this.CenterToParent() в событии Form_Load (когда родитель фактически известен). Не вызывайте это в конструкторе, потому что вызывается родитель, который он задает, когда вызывается Show (form).

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

Я знаю, что эта ветка старая, но на нее можно ответить довольно легко, поэтому, надеюсь, помочь другим, кто сталкивается с ней, найти легкое решение.

Ответ 4

Чтобы сосредоточиться на родительском для вызова .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;

Ответ 5

Вы пытались установить свойство в вызывающем методе?

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

Ответ 6

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

}

Попробуйте установить его перед InitializeComponent(). Возможно, уже слишком поздно после InitializeComponent (форма может быть уже запущена, а StatPosition установлен слишком поздно).

Update

Я только что написал:

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

и

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

В проекте VS (совершенно новый), и когда я нажимаю в своей форме2 на кнопку, он открывает форму в середине экрана. Вы можете сделать то же самое с родителем...

Ответ 7

Я бы предложил проверить ваши DealsForm.Designer.cs и удалить строку, которая устанавливает StartPosition там, а затем делать это как есть.

В качестве альтернативы, возможно, попробуйте установить его в случаях загрузки или отображения формы.

Ответ 8

Моя первая реакция: немного экспериментировать с VS2008. Он должен находиться на экране общих свойств.

Если у вас нет Visual Studio, это становится немного сложнее.

Хорошим сайтом для проверки может быть этот: csharp-online.net

Извините, что я не могу быть более полезным