2010-12-05 1 views
4

У меня проблема со странной проблемой. Я использую 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, но безрезультатно. Пожалуйста, помогите мне.

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

+0

Вы прошли через это в отладчике, чтобы узнать, что на самом деле происходит? Возможно, будет выполнен другой код, который вы не включили здесь. – Darbio 2010-12-05 12:32:51

+0

Что произойдет, если вы прокомментируете две первые строки в этом методе? Разве Form1 по-прежнему закрывается, если вы не делаете ее невидимой и скрываете ее кнопку TaskBar? – Ran 2010-12-05 12:33:02

+0

Является ли родительская форма (`form1`) фактически * закрытой * или она остается только * невидимой *? – stakx 2010-12-05 12:47:40

ответ

6

Да, этот код является хлопотным. Это происходит неправильно, когда пользователь закрывает диалог. Затем 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
  • Рассматривали ли вы исключения? Если 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.

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


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