调用使用 Using 语句打开的子窗体的方法
Invoke a Method of Child form opened with Using Statement
我想知道如何调用在 using 块中打开的子窗体的方法。
在我的代码中,我有一个作为 MDI 父级的 MainForm。 MDI parent 持有父窗体的引用。声明以下方法的父表单。
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 { }
}
子窗体打开于
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);
}
}
我想知道如何调用在 using 块中打开的子窗体的方法。
在我的代码中,我有一个作为 MDI 父级的 MainForm。 MDI parent 持有父窗体的引用。声明以下方法的父表单。
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 { } }
子窗体打开于
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);
}
}