关闭新表单将关闭另一个表单的消息框

时间:2013-07-17 15:15:44

标签: c# forms messagebox

我有一个c#类,它是一个Windows窗体应用程序。在此应用程序中,当我右键单击特定控件时,将打开一个新表单。

这个新表单有一些信息和一个按钮。单击此按钮时,将调用主类(窗体)中的函数。通过使用运行this.Close()的deactivate-event失去焦点时,表单(通过右键单击主窗体获得的表单)将关闭。

问题是它还关闭了一个从被调用的函数运行的消息框。

这是为什么?我说this.Close()其中this是新表单,而不是主表单中的消息框。

1 个答案:

答案 0 :(得分:0)

正在打开的MessageBox正在停用您的子表单,因此它已关闭。 在不告知其父级的情况下打开MessageBox时,将使用当前活动窗口,在本例中为您的子窗体。当MessageBox的父(子窗体)关闭时,MessageBox也会关闭。

如果您希望主窗体打开MessageBox,即使从另一个窗口调用它,也要使用使用IWin32Window owner - 参数的重载。

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

    private void button_Click(object sender, EventArgs e) {
        var form = new ChildForm(this);
        form.Show();
    }

    // Method called by ChildForm
    public void OpenMessageBox() {
        IWin32Window owner = this;
        MessageBox.Show(owner, "MessageBox opened from MainForm, but called from within ChildForm");
    }
}

我发现您的代码存在一个问题。您将控制逻辑从MainForm委派给ChildForm回到MainForm。尝试让MainForm使用ChildForm的FormClosed-Event控制逻辑流程。请注意,这是一个可选步骤,让我们说一个更简洁的方法来获得你想要实现的行为。

    private void button_Click(object sender, EventArgs e) {
        var form = new ChildForm(this);
        form.FormClosed += ChildFormClosed;
        form.Show();
    }

    private void ChildFormClosed(object sender, FormClosedEventArgs formClosedEventArgs) {
        var childForm = (Form)sender;
        childForm.FormClosed -= ChildFormClosed;

        MessageBox.Show("MessageBox opened from MainForm");
    }
}