6

我试图在 MDI 父级上检测我的 MDI 子窗体何时关闭,并做出相应的反应。MDI 父级在 MDI 子级关闭之前不应执行任何操作。这是我的代码,我不确定我做错了什么,但是我添加的表单关闭事件方法永远不会被调用......

以下代码位于 MDI 父类中,如果不明显的话。

    private void keyValidation()
    {
        if (Properties.Settings.Default.Unlock == true)
            return;
        else
        {
            menu.Enabled = false;
            statusStrip.Enabled = false;

            ValidationForm vf = new ValidationForm();
            vf.MdiParent = this;
            vf.Show();
            vf.FormClosed += new FormClosedEventHandler(validationForm_FormClosed);
        }
    }

    void validationForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("Got here");
        if (Properties.Settings.Default.Unlock == true)
        {
            menu.Enabled = true;
            statusStrip.Enabled = true;
        }
    }

谢谢你的帮助!

4

6 回答 6

1

虽然这并不能真正解决您所指的问题,但从用例来看,您可能需要考虑将验证表单打开为模式对话框而不是 MDI 子项。

您可以使用ShowDialog()您现在拥有的表单方法来执行此操作Show()。请记住,如果您将它们分配给另一个表单上的按钮,ShowDialog()也可以返回 a 。DialogResult

于 2010-12-06T16:27:32.710 回答
0

也许,只是也许,你有一个隐藏不关闭的儿童表格。尝试挂钩 VisibleChanged 看看会发生什么。

此外,FormClosing 将允许您取消关闭,而 FormClosed 不会为您提供该选项。

于 2010-12-06T16:26:38.643 回答
0

不要使用Closed事件。相反,使用FormClosing事件:

private void frmMain_FormClosing(object sender, FormClosingEventArgs e){
  if (MessageBox.Show("Are you sure you want to Exit", "Confirmation", MessageBoxButtons.YesNo,MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.No) {
    e.Cancel = true;
  }
}
于 2012-01-04T09:44:33.660 回答
0

当通过将 IsMdiContainer 设置为 true 将 ParentForm 标记为 MdiContainer 时,将引发 ParentForm.ControlAdded 事件以将“MdiClient”控件添加到父窗体。因此,当将 MdiClient 添加到父 MDI 表单时,我们可以为 MdiClient 控件引发 ControlAdded 事件,如下所示,

  public ParentForm()
  {
    InitializeComponent();
    this.ControlAdded += Form1_ControlAdded;
    this.IsMdiContainer = true;

我们需要提高 MdiClient.ControlAdded 如下所示,

    void Form1_ControlAdded(object sender, ControlEventArgs e)
      {
           if(e.Control is MdiClient)
                e.Control.ControlAdded += MdiClient_ControlAdded;

      }

默认情况下, MDI 子窗体被添加到父窗体中的 MdiClient 的控件集合中。因此,当将 ChildForm.MdiParent 值设置为 Parent 表单时,MdiClient 的 ControlAdded 事件将引发

void MdiClient_ControlAdded(object sender, ControlEventArgs e)
{
    if (e.Control is Form)
        {
            var form = e.Control as Form;
            form.FormClosing += form_FormClosing;
            form.FormClosed += form_FormClosed;
        }
}

在上面的这个 MdiClient_ControlAdded 方法中,当子表单添加到父 MDI 表单中时会引发。因此,通过引发子窗体的 FormClosing 和 FormClosed 事件,您可以轻松检测子窗体是否已关闭。

于 2017-03-24T04:44:06.787 回答
0

当你可以调用 MDI Parent 到 MDI Child 的事件处理程序时,为什么你要做这么多事情?

假设我想在我的孩子被激活或停用时做某些事情。您只需要声明 MDI Parent 的一些事件处理程序(例如SetupToolStripMenu_PlantMasterRecipe)并在其中提及您想要做的一些逻辑。通过这种方式,您可以从 MDI Parent 控制 MDI Child 的每个对象行为。

这里 objB 是我的 Child 表单,我正在 MDI Parent 中编写这段代码:

objB.MdiParent = this;

objB.Activated += SetupToolStripMenu_PlantMasterRecipe;

objB.Deactivate += DisposeToolStripMenu;

objB.Show();
于 2017-06-29T12:40:08.023 回答
0

在 mdiparent 上创建一个公共函数

public void MakeMenuVisible()
{
MainMenu.visible = true;
}

然后在childform上你可以像这样运行函数

private void ChildForm_FormClosed(object sender, FormClosedEventArgs e)
{
//Cast MdiParent to Mainform
((mainform)this.MdiParent).MakeMenuVisible();  
}
于 2019-01-09T09:48:33.240 回答