【问题标题】:Closing new form closes another form's messagebox关闭新表单会关闭另一个表单的消息框
【发布时间】:2013-12-09 15:44:05
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能把你的代码贴在这里让我们看看会发生什么吗?

标签: c# forms messagebox


【解决方案1】:

打开的 MessageBox 正在停用您的子窗体,因此它已关闭。 当打开 MessageBox 而不告诉其父级时,将使用当前活动窗口,在这种情况下是您的子窗体。当 MessageBox 的父(子窗体)关闭时,MessageBox 也会关闭。

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

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。尝试通过使用 ChildForm 的 FormClosed-Event 让 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");
    }
}

【讨论】:

  • 非常感谢!如果我被允许,我会投票给答案。
猜你喜欢
  • 2012-09-07
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
相关资源
最近更新 更多