Закрытие диалоговой формы закрывает родительскую форму - PullRequest
4 голосов
/ 05 декабря 2010

Я имел дело со странной проблемой.Я использую KryptonForm в проекте.У меня есть форма (скажем, form1), и мне нужно открыть другую форму по нажатию кнопки из этой формы.Вот код:

void btn_click(object sender, EventArgs e)
{
    Visible = false;
    ShowInTaskbar = false;

    var f = new Form2();
    f.ShowDialog();

    Visible = true;
    ShowInTaskbar = true;
}

Проблема в том, что когда Form2 закрывается, он также закрывает Form1 .Я попытался установить DialogResult = DialogResult.None из Form2 , но безрезультатно.Пожалуйста, помогите мне.

Я всегда использую эту технику, и такого никогда не было.

Ответы [ 3 ]

6 голосов
/ 05 декабря 2010

Да, этот код неприятен.Это идет не так, когда пользователь закрывает диалог.Затем Windows должна найти другое окно, на которое нужно обратить внимание.В вашем приложении ничего не осталось, ваше главное окно невидимо.Затем он выбирает окно другого приложения.Хорошие шансы, например, что это будет окно внутри Visual Studio.Большой.Ваша основная форма теперь исчезает за ней.

Вам необходимо убедиться, что ваше главное окно снова отображается до того, как закроется диалоговое окно.Вы можете сделать это, подписавшись на обработчик событий FormClosing диалога.Например:

    private void button1_Click(object sender, EventArgs e) {
        using (var dlg = new Form2()) {
            dlg.StartPosition = FormStartPosition.Manual;
            dlg.Location = this.Location;
            dlg.FormClosing += (s, ea) => this.Show();    // <=== Here
            this.Hide();
            if (dlg.ShowDialog() == DialogResult.OK) {
                // etc...
            }
        }
    }
0 голосов
/ 21 июня 2018

жули меня на несколько дней !! Нашел это: https://bytes.com/topic/net/answers/769433-c-showdialog-inside-showdialog-closing-both-return

Результат передавался, и я не знаю почему. Но если после .ShowDialog () я просто поставлю this.DialogResult = DialogResult.None, это исправит. Это не должно происходить в первую очередь, но это исправляет, поэтому я не слишком обеспокоен.


Вы также можете попробовать изменить dialogResult на самой кнопке на «Нет» или удалить this.Btn1.DialogResult... из конструктора, который работал для некоторых людей.

https://social.msdn.microsoft.com/Forums/vstudio/en-US/543093ad-1860-4428-bae1-b0d4f112e04b/showdialog-closes-parent?forum=csharpgeneral

0 голосов
/ 05 декабря 2010
  • Рассматривали ли вы исключения ? Если Form2 выдает исключение, ваши последние операторы Visible = true и ShowInTaskbar = true не будут выполнены. Что происходит, когда вы пытаетесь это:

    ShowInTaskbar = Visible = false;
    try
    {
        using (var f = new Form2())  // (added since Form2 is an IDisposable)
        {
            f.ShowDialog();
        }
    }
    finally  // make sure that the following gets executed even when 
    {        // exceptions are thrown during f.ShowDialog():
        ShowInTaskbar = Visible = true;
    }
    

  • Что происходит, когда вы открываете другую форму, отличную от Form2 внутри этого метода?

    Если проблема исчезнет, ​​возможно, проблема не в этом методе, а в Form2.

    Если проблема не исчезла: вы уверены, что в этом методе вы делаете то же самое, что и в других методах, в которых вы применяете ту же технику?


  • Попробуйте удалить первую строку и посмотрите, сохраняется ли проблема. Или другой вопрос: ваша родительская форма остается только невидимой или действительно ли она закрывается ?
...