3

我有一个 MDI 父窗口,它可以包含来自特定子级的多个实例,称为frmChild。现在,当从父级单击特定控件时,我需要获取活动的 frmChild 并从 frmChild 调用特定方法

下面是我正在尝试实现的图像(获取活动的 MDI 子并从该类调用特定方法):

一只忙碌的猫

现在每个 frmChild 都通过以下方式实例化:

private void newFileToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        frmNewDocument = new frmNewDocument();
        frmNewDocument.MdiParent = this;
        frmNewDocument.Show();
    }

当我想从活动的 frmChild调用方法时,我正在尝试以下操作并被卡住:

private void saveFileToolStripMenuItem1_Click(object sender, EventArgs e)
    {
        /* get active MDI child*/
        Form frmActiveNewDocument = this.ActiveMdiChild;           
        
        /* make sure MDI child is a "New Document" type form */
        if (frmActiveNewDocument.GetType() == frmNewDocument.GetType())
        {
            /* invoke a method from active frmChild here */
        }
    }

我仍在学习 OOP,并且确信这是一些原则。如果能在文章中提到,那也太好了。

**注意:我读到对 frmChild 的干扰是解决此问题的最佳方法,因此主窗体不需要在每个 frmChild 中进行挖掘,因此我创建了一个 frmChild 使用的接口,即:**

 public interface NewFileFormInterface
{
    void saveFile();
}

现在,saveFile()是我想从 Main 调用的方法,它在 frmChild 中实现。

关于这个问题的任何帮助以及我可以研究的一些关键字都会很棒。

蒂亚!

4

4 回答 4

2
frmNewDocument child = ActiveMdiChild as frmNewDocument;
if (child != null)
{
    child->saveFile();
}

as 关键字执行运行时强制转换。如果对象(本例中为 ActiveMdiChild)为 null 或不是 as 类型,则结果将为 null。

http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx

您可能也有兴趣阅读: .Net 命名约定指南

于 2012-05-22T17:52:49.280 回答
1

尝试这个:

if (ActiveMdiChild is frmNewDocument)
{
    (ActiveMdiChild as frmNewDocument).saveFile();
}
于 2012-05-22T17:57:54.840 回答
1

我知道这很旧,但这一直对我有用。

在子代码中:

public void SaveFile()
{
  // Some code goes here.
}

在父代码中:

frmNewDocument child = this.ActiveMdiChild as frmNewDocument;
if(child != null)
{
  child.SaveFile();
}

希望这可以帮助其他正在寻找更简洁有效答案的人。

于 2014-04-10T19:07:13.743 回答
0

我是这样做的。“AuditAddMod”是一种形式。我有平行的孩子。该表单中有一个公共的“PassData()”方法,该方法被调用并在同级表单中执行我需要的操作。

private void LoadRelatedFollowUpAuditTable()
{
   foreach (Form form in this.MdiParent.MdiChildren)
   {
      if (form.Name == "AuditAddMod" && form.Text != this.Text)
      {
         ((AuditAddMod)form).PassData(form.Name, 1);
      }
   }
}
于 2020-04-30T18:32:16.977 回答