在Winforms中关闭另一个表单中不相关的.NET表单

时间:2012-11-17 11:40:30

标签: .net winforms

我试图理解WinForms应用程序中以下代码的行为 我有两种形式 - Form1和Form2。当我从Form2中关闭Form1时,甚至Form2也会关闭。我确保它们都将Owner属性设置为null。

有人可以解释为什么Form2也会从下面的代码中关闭吗? Form1:

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

Form2:

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上的Button时,Form1和Form2都会关闭。我还确保该按钮不是Form2的okbutton或cancelbutton。任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

Form1关闭是因为您创建了一个新的Form1并将其传递给Form2,而在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());