如何通过函数调用mdi表单
本文关键字:表单 mdi 函数调用 何通过 | 更新日期: 2023-09-27 18:28:57
我如何为下面的代码创建一个函数,这样我就不必编写下面的整个代码来使表单用作MDICHILD form。
Students stu = null;
private void studentsToolStripMenuItem1_Click(object sender, EventArgs e)
{
if (stu == null || stu.IsDisposed)
{
stu = new Students();
stu.MdiParent = this;
stu.Show();
}
else
{
stu.Activate();
}
}
而我想要像这个
private void studentsToolStripMenuItem1_Click(object sender, EventArgs e)
{
CreateMdiChild(Students);
}
功能应该像这个
public void CreateMdiChild(Form form)
{
//expected code
}
您可以使该方法通用,例如:
public void CreateMdiChildOrActivate<T>(ref T instance) where T : Form, new()
{
if (instance == null || instance.IsDisposed)
{
instance = new T();
instance.MdiParent = this;
instance.Show();
}
else
{
instance.Activate();
}
}
用法:
private void studentsToolStripMenuItem1_Click(object sender, EventArgs e)
{
CreateMdiChildOrActivate(ref this.stu);
}
编辑:
如果你不想为每个表单创建一个类字段,你可以这样做:
为每个表单类型创建一个包含打开表单的类字典字段:
private Dictionary<Type,Form> openForms = new Dictionary<Type,Form>();
然后将以前的方法更改为:
public void CreateMdiChildOrActivate<T>() where T : Form, new()
{
Form instance;
openForms.TryGetValue(typeof(T), out instance);
if (instance == null || instance.IsDisposed)
{
instance = new T();
openForms[typeof(T)] = instance;
instance.MdiParent = this;
instance.Show();
}
else
{
instance.Activate();
}
}
现在你可以这样称呼它:
private void studentsToolStripMenuItem1_Click(object sender, EventArgs e)
{
CreateMdiChildOrActivate<Student>();
}
public void CreateMdiChild<T>(Form f) where T : Form, new()
{
foreach (Form frm in f.MdiChildren)
{
if (frm.GetType() == typeof(T))
{
if (frm.WindowState == FormWindowState.Minimized)
{
frm.WindowState = FormWindowState.Normal;
}
else
{
frm.Activate();
}
return;
}
}
T t = new T();
t.MdiParent = f;
t.Show();
}
用法
CreateMdiChild<MyForm>()