从父母那里调用特定MDI孩子的方法

时间:2012-05-22 17:24:16

标签: c# winforms

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

下面是我想要实现的图像(获取活动的MDI子节点并从该类调用特定方法):

a busy cat http://i47.tinypic.com/aurv7.jpg

现在每个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的干扰是解决这个问题的最佳方法,因此Main表单不需要在每个frmChild中进行挖掘,所以我创建了一个frmChild使用的接口,这是:**

 public interface NewFileFormInterface
{
    void saveFile();
}

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

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

TIA!

4 个答案:

答案 0 :(得分: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 Naming Convention Guidelines

答案 1 :(得分:1)

试试这个:

if (ActiveMdiChild is frmNewDocument)
{
    (ActiveMdiChild as frmNewDocument).saveFile();
}

答案 2 :(得分:1)

我知道这已经老了,但这一直对我有用。

在子代码中:

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

在父代码中:

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

希望这可以帮助那些正在寻找更简洁的答案的人。

答案 3 :(得分:0)

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

# ...
print('input: ',input[0,0:3,100:105,100:105])
break