通过数据库字段动态加载菜单,点击菜单后通过反射SHOW出窗体,现在的问题是怎么样才能给这些个SHOW的窗口传递参数(string 类型)?
SHOW出窗体的代码如下。ToolStripMenuItem tsi = sender as ToolStripMenuItem;//得到事件源,强转为菜单项
Assembly asb = Assembly.GetExecutingAssembly();//得到当前的程序集
Form f = (Form)asb.CreateInstance("Test." + tsi.Tag.ToString());//利用反射,根据数据库中的字段值创建窗体对象
foreach (System.Windows.Forms.Form ff in pnc_info.Controls)
{
//如果子窗体存在,激活子窗体 if (ff.Name == f.Name)
{
ff.WindowState = System.Windows.Forms.FormWindowState.Minimized;
ff.Activate();
ff.Size = ff.Parent.Size;
ff.WindowState = System.Windows.Forms.FormWindowState.Maximized;
return;
}
}
f.TopLevel = false; //设置属性
f.Show(); //显示form
SHOW出窗体的代码如下。ToolStripMenuItem tsi = sender as ToolStripMenuItem;//得到事件源,强转为菜单项
Assembly asb = Assembly.GetExecutingAssembly();//得到当前的程序集
Form f = (Form)asb.CreateInstance("Test." + tsi.Tag.ToString());//利用反射,根据数据库中的字段值创建窗体对象
foreach (System.Windows.Forms.Form ff in pnc_info.Controls)
{
//如果子窗体存在,激活子窗体 if (ff.Name == f.Name)
{
ff.WindowState = System.Windows.Forms.FormWindowState.Minimized;
ff.Activate();
ff.Size = ff.Parent.Size;
ff.WindowState = System.Windows.Forms.FormWindowState.Maximized;
return;
}
}
f.TopLevel = false; //设置属性
f.Show(); //显示form
string typeName,
bool ignoreCase,
BindingFlags bindingAttr,
Binder binder,
Object[] args,
CultureInfo culture,
Object[] activationAttributes
)
args
类型: array<System ..::.Object []()>[]
Object 类型的数组,包含要传递给构造函数的参数。 此参数数组在数量、顺序和类型方面必须与要调用的构造函数的参数匹配。如果需要默认的构造函数,则 args 必须是空数组或 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing)。
public static void OpenOneForm<T>(object[] parameters) where T : Form
{
Form openForm = null;
foreach (Form form in System.Windows.Forms.Application.OpenForms)
{
if (form.GetType() == typeof(T))
{
openForm = form;
break;
}
}
if (openForm != null)
{
if (openForm.WindowState == FormWindowState.Minimized)
openForm.WindowState = FormWindowState.Normal;
openForm.Activate();
}
else
{
openForm = (T)Activator.CreateInstance(typeof(T), parameters);
openForm.Show();
}
}给段代码,可以参考一下。
反射的时候Invoke这个MethodInfo
arg:object[]