C# 如何从mdi父级c调用子窗体的方法

C# 如何从mdi父级c调用子窗体的方法,c#,winforms,mdi,mdichild,C#,Winforms,Mdi,Mdichild,我有几个子表单,但它们有一个常用的方法,get\u CurrentClamp。我想从MDI父级调用当前活动MDI子级的方法 这是MDIMain.cs父窗体中menuitem的onclick事件,该窗体应调用该方法 .... private void mnugetCToolStripMenuItem_Click(object sender, EventArgs e) { if (MdiChildren.Any()) { For

我有几个子表单,但它们有一个常用的方法,get\u CurrentClamp。我想从MDI父级调用当前活动MDI子级的方法

这是MDIMain.cs父窗体中menuitem的onclick事件,该窗体应调用该方法

....
 private void mnugetCToolStripMenuItem_Click(object sender, EventArgs e)
   {
    if (MdiChildren.Any())
            {
                Form f = this.ActiveMdiChild;            
               f.get_CurrentClamp(varCurrentThreshhold);
            }
   }
.....
在子窗体frmDashboard.cs中

但我总是出错,哪里出了问题?任何帮助都将不胜感激

错误是这样的

错误3“System.Windows.Forms.Form”不包含的定义 “get\u CurrentClamp”和无扩展方法“get\u CurrentClamp” 接受类型为“System.Windows.Forms.Form”的第一个参数可能会 是否缺少using指令或程序集引用


这就是我在mdiparent窗体上遇到的错误。

如果您确定活动窗体将是frmDashboard实例之一,则可以将f声明为该类型:

frmDashboard f = this.ActiveMdiChild;
为了以防万一,你可能需要尝试一下。无论如何,它在VB中工作。关于C不太清楚。

多亏了我使用接口解决了这个问题。 我在一个名为IChildMethods.cs的文件中创建了一个新接口,下面是接口

 internal interface IChildMethods
    {
        void get_CurrentClamp(float curThreshhold=5.5);
    }
在子表单中,我只是在表单frmDashboard.cs中包含了如下界面

和在mdiform MDIMain.cs上


自从接口方法起作用以来,我还没有尝试过使用反射方法,但我只是想知道,在这样的问题中,反射是否比使用接口更好

您是否找到了get\u CurrentClamp not found?您正在强制转换为标准表单类型,当然没有名为get\u CurrentClamp的方法。您可以使用反射来获取方法并调用它。更好的解决方案是让所有子窗体实现一个包含该方法的接口;然后你可以转换到接口并调用方法…@MarkHall,我已经将错误消息添加到问题中。你的错误消息确认了所有人都知道的。见我的评论。你要用反射还是界面来解决?如果您在实施过程中遇到困难,请使用详细信息进行编辑。。。
 internal interface IChildMethods
    {
        void get_CurrentClamp(float curThreshhold=5.5);
    }
 public partial class frmDashboard : Form, IChildMethods
....
 private void mnugetCToolStripMenuItem_Click(object sender, EventArgs e)
   {
    if (MdiChildren.Any())
            {
               if (this.ActiveMdiChild is IChildMethods)
            {
                ((IChildMethods)this.ActiveMdiChild).get_CurrentClamp(varCurrentThreshhold);
            }            

            }
   }
.....