C# 关闭新表单将关闭另一个表单';s消息框

C# 关闭新表单将关闭另一个表单';s消息框,c#,forms,messagebox,C#,Forms,Messagebox,我有一个c#类,它是一个windows窗体应用程序。在此应用程序中,当我右键单击特定控件时,将打开一个新窗体 这个新表单有一些信息和一个按钮。单击此按钮时,将调用主类(窗体)中的函数。窗体(通过右键单击主窗体获得的窗体)在使用运行this.Close()的停用事件失去焦点时关闭 问题是它还关闭了从调用的函数运行的messagebox 为什么会这样?我说this.Close()其中this是新表单,而不是主表单中的messagebox。打开的messagebox正在停用您的子表单,因此它被关闭。

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

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

问题是它还关闭了从调用的函数运行的messagebox


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

打开的messagebox正在停用您的子表单,因此它被关闭。 打开MessageBox而不通知其父窗体时,将使用当前活动窗口,在本例中为子窗体。当MessageBox的父窗体(子窗体)关闭时,MessageBox get也将关闭

如果希望主窗体打开MessageBox,即使它是从另一个窗口调用的,也可以使用使用
iwin32windowowner
-参数的重载

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。尝试使用子窗体的FormClosed事件让MainForm控制逻辑流。请注意,这是一个可选步骤,比如说一种更干净的方法来实现您不希望实现的行为

    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");
    }
}

你能把你的代码贴在这里让我们看看会发生什么吗?非常感谢!如果我被允许的话,我会投票赞成这个答案。