2013-08-22 3 views
4

В следующем коде Form1 открывает еще два Form s, а затем закрывает один из них. В результате вторая дочерняя форма также закрывается. Зачем?Закрытие одной дочерней формы закрывает другую дочернюю форму

public partial class Form1 : Form 
{ 
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer { Interval = 2000 }; 

    public Form1() 
    { 
     InitializeComponent(); 
     ShowForm3(); 
     (new Form2()).ShowDialog();//If this is changed to 'Show' - it doesn't get closed. 
    } 

    void ShowForm3() 
    { 
     Form3 f3 = new Form3(); 
     f3.Show(); 
     timer.Tick += (sender, e) => f3.Close(); 
     timer.Start(); 
    } 
} 

Form2 и Form3 являются стандартными формами VS.

() Дополнительно: Это простая версия исходного кода. В оригинале (который, конечно же, слишком длинный для публикации здесь) этого не происходит, когда выполняется из Visual Studio (ни отладка, ни выпуск) .Это происходит только при установке в качестве приложения clickonce, а затем - даже если я просто нажму исполняемый файл (в папке AppData). (Возможно, есть еще одна часть кода, которая предотвращает ее там, когда выполняется от VS, но Я еще не нашел, что еще.) Что может быть причиной этого несоответствия? Возможно, какой-то тип оптимизации в clickonce, который не выполняется в обычном режиме Release?)

+0

Это th e раз, чтобы открыть 'Reflector' –

+0

@SriramSakthivel Я предполагаю, что вы имеете в виду последний абзац. Хорошая идея. Благодарю. – ispiro

+0

Нет, я могу воспроизвести использование самого VS –

ответ

5

Измените код, чтобы он работал:

public partial class Form1 : Form 
    { 
    System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer { Interval = 2000 }; 

    public Form1() 
    { 
     InitializeComponent(); 
     ShowForm3(); 
     (new Form2()).ShowDialog(this); 
    } 

    void ShowForm3() 
    { 
     Form3 f3 = new Form3(); 
     f3.Show(); 
     timer.Tick += (sender, e) => f3.Close(); 
     timer.Start(); 
    } 
    } 

объяснения: когда вы не сдали форму родителя, окно будет активным окно как родитель, используя этот метод: GetActiveWindow, а что случилось это:

когда называют form2.showDialog() // родительское окно - это форма 3, потому что метод GetActiveWindow получает отображаемое окно и form1 не является активным или показывает

при принуждении родителя: , когда call form2.showDialog (this) // родительское окно является формой 1, потому что вы определили фиксированный

+0

Можете ли вы объяснить? это работает. но почему это не так, и это так? –

+0

Запустите старый код без запуска таймера. Перерыв и посмотрите, что такое родитель Form3. Я подозреваю, что родитель будет установлен в Form2 (поскольку это была самая верхняя форма, когда была показана форма 3). –

+0

Я редактирую с объяснением – renefc3