0

WinForms アプリケーションでの次のコードの動作を理解しようとしています。
Form1 と Form2 の 2 つのフォームがあります。Form2 内から Form1 を閉じると、Form2 も閉じられます。どちらも Owner プロパティが null に設定されていることを確認しました。

以下のコードから Form2 も閉じられる理由を誰でも説明できますか?
フォーム1:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
}

フォーム2:

public partial class Form2 : Form
{
    Form1 f1;
    public Form2(Form1 f1)
    {
        InitializeComponent();
        this.f1 = f1;
    }

    private void button1_Click(object sender, EventArgs e)
    {          
        f1.Close();         
    }
}

Program.cs

static void Main()
    {           
        Form1 f1 = new Form1();
        f1.Size = new Size(0, 0);
        f1.Show();           

        Form2 f2 = new Form2(f1);
        f2.ShowDialog();            

        Application.Run(new MainForm());
    }

Form2 のボタンをクリックすると、Form1 と Form2 の両方が閉じられます。ボタンが Form2 の okbutton または cancelbutton でないことも確認しました。なぜこれが起こるのか誰か説明できますか?

4

1 に答える 1

1

新しい Form1 を作成して Form2 に渡したため、Form1 が閉じます。Form2 内で Form1 を閉じています。また、Form2 が DialogForm であり、Form1 の後に作成されたという理由だけで、Form1 の DialogForm と見なされるため、Form1 が閉じられると、DialogForm も閉じられます。これは、風変わりなものではなく、予想される動作です。

を使用して表示するか

f2.Show();

または、MainForm 内に Form2 ダイアログ フォームを表示する (MainForm 経由で f1 を Form2 に渡す) と、Form1 は閉じますが、Form2 は閉じません。

アップデート:

これを Program.cs で試してみると、Form1 を閉じた後にアプリケーションの MainWindow が閉じられていることがわかります。

Form1 f1 = new Form1();
f1.Size = new Size(0, 0);
f1.Show();

MessageBox.Show(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle.ToString());

Form f2 = new Form2(f1);

MessageBox.Show(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle.ToString());

f2.ShowDialog();

MessageBox.Show(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle.ToString());

Application.Run(new MainForm());
于 2012-11-17T12:16:23.867 に答える