调用使用 Using 语句打开的子窗体的方法

Invoke a Method of Child form opened with Using Statement

我想知道如何调用在 using 块中打开的子窗体的方法。

在我的代码中,我有一个作为 MDI 父级的 MainForm。 MDI parent 持有父窗体的引用。声明以下方法的父表单。

  1. ParentForm 实例在 MDIParent 窗体中可用,如以下代码所示。

    MainForm.cs

     private void OpenParentForm()
     {
         try
         {
    
             FormParent frmParent = null;
             frmParent = Application.OpenForms["frmParent"] as FormParent;
    
             if (frmParent != null)
             {
                 frmParent.Focus();
             }
             else
             {
                 frmParent = new FormParent();
                 frmParent.Name = "frmParent";
                 frmParent.MdiParent = this;
                 frmParent.Show();
             }
    
         }
         catch { }
     }
    
  2. 子窗体打开于

    frmParent.cs

     private void ShowChildForm()
     {
         try
         {
             using (ChildForm frmChild = new ChildForm())
             {
    
                 if (frmChild.ShowDialog() == DialogResult.OK)
                     this.RefreshData();
    
                 frmChild.Dispose();
             }
         }
         catch { }
     }
    

具有以下方法的 ChildForm。

ChildForm.cs

private void ChildMethod()
{
    //........
    //........
    //........
}

以下是我的InvokeMethod

ReflectionHelper.cs

public static async Task<bool> InvokeMethod(Form Window, string methodName, object param)
{
    try
    {
        Form mainWindow = Window;
        var MainWindowtype = mainWindow.GetType();
        MethodInfo MethodtoInvoke = MainWindowtype.GetMethod(methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
        if (MethodtoInvoke != null)
        {
            ParameterInfo[] pars = MethodtoInvoke.GetParameters();
            object[] Parameter = null;

            try
            {
                object returnValue = null;
                if (pars != null && pars.Length > 0)
                {
                    Parameter = new object[pars.Length];
                    foreach (var item in pars)
                    {
                        int index = item.Position;
                        if (param != null)
                        {
                            if (param.GetType() == item.ParameterType || item.ParameterType == typeof(object))
                            {
                                Parameter[index] = param;
                            }
                        }
                    }
                    returnValue = MethodtoInvoke.Invoke(mainWindow, Parameter);
                  
                }
                else
                    returnValue = MethodtoInvoke.Invoke(mainWindow, null);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception InvokeMethod  \n" + ex.Message);
            }
        }
    }
    catch (Exception ex)
    {
        return false;
    }
    return true;
}

目前,我可以调用 MainForm 中可用的 Parentform 实例方法。

Helper.cs

public class Helper
      {
        private async void OpenParentForm(string MethodName)
        {
        ReflectionHelper.InvokeMethod(static Instance of MainForm, MethodName, null);
        }
        private async void ShowChildForm(string MethodName)
        {
        ReflectionHelper.InvokeMethod(Instance of frmParent, MethodName, null);
        }
        private async void ChildMethod(string MethodName)
        {
        Invoke ChildMethod ???
        }
      }

CallingClass.cs

 class CallingClass
        {
            public async Task<bool> CallMethod(string MethodName)
            {
                switch (MethodName)
                {
                    case "OpenParentForm":
                        Helper.OpenParentForm(MethodName);
                        break;
                    case "ShowChildForm":
                        Helper.ShowChildForm(MethodName);
                        break;
                    case "ChildMethod":
                        Helper.ChildMethod(MethodName);
                        break;
                }
                return true;
            }
        }

我想调用 MainForm>>frmParent>>[Instance of ChildForm in using block of frmParent.cs].ChildMethod()

您可以使用 Application.OpenForms["FormName"]

获取已打开表单的实例

示例:

ChildForm frmChild = Application.OpenForms["ChildForm"] as ChildForm;

然后您可以将该实例作为参数传递到您的 InvokeMethod 中以调用您的 ChildForm 方法。

ReflectionHelper.InvokeMethod(frmChild , MethodName, null);

您的 Helper.cs 文件将如下所示:

public class Helper
{
        .....
        .....
        .....
        .....
        private async void ChildMethod(string MethodName)
        {
            ChildForm frmChild = Application.OpenForms["ChildForm"] as ChildForm;
            if(frmChild!=null)
              ReflectionHelper.InvokeMethod(frmChild , MethodName, null);
        }
 }