刚刚开始做CS项目,对于项目中的应用各种不熟悉。在MDI容器窗体上设置了一个菜单,菜单上每一个按钮可以打开一个子窗体。最初使用的方法是
/// <summary> /// 选择面板 /// </summary> private static OpenSelect os; private void OpenSelectForm() { if (os == null || os.IsDisposed) { os = new OpenSelect(); os.MdiParent = this; os.Show(); } }
基本上打开每一个窗体都是这个做的。结果后台的代码很长很长,而且都是重复的。后来在整理代码的时候想起了很神奇的反射功能。于是,将代码更改成了下面
public partial class MainForm : Form { public MainForm() { InitializeComponent(); SetFormList(); } /// <summary> /// 按钮的名称和窗体的命名空间和名称 /// </summary> Dictionary<string, string> formList = new Dictionary<string, string>(); /// <summary> /// 已经打开的窗体 /// </summary> List<string> openList = new List<string>(); /// <summary> /// 将按钮名称和窗体的命名空间及名称添加进集合 /// </summary> private void SetFormList() { formList.Add("tsmNewDecive", "EmluatorSystem.NewDevice"); formList.Add("tsmManageDevice", "EmluatorSystem.ManageDevice"); formList.Add("TsmiCreateWave", "EmluatorSystem.CreateWave"); formList.Add("TsmiSynch", "EmluatorSystem.WaveBuild"); formList.Add("ToolItemAddTaskTempLate", "EmluatorSystem.TaskTempLateForm"); formList.Add("toolCustTaskManage", "EmluatorSystem.CustTaskManage"); } /// <summary> /// 菜单按钮 /// </summary> private void MenuStripClick(object sender, EventArgs e) { ToolStripMenuItem tsmt = (ToolStripMenuItem)sender; if (formList.ContainsKey(tsmt.Name)) { if (!openList.Contains(formList[tsmt.Name])) { Assembly assembly = Assembly.GetExecutingAssembly(); object obj = assembly.CreateInstance(formList[tsmt.Name]); Form f = (Form)obj; f.FormClosing += new FormClosingEventHandler(f_FormClosing); openList.Add(string.Format("EmluatorSystem.{0}", f.Name)); f.MdiParent = this; f.Show(); } } } void f_FormClosing(object sender, FormClosingEventArgs e) { Form f = (Form)sender; openList.Remove(string.Format("EmluatorSystem.{0}", f.Name)); f.FormClosing -= new FormClosingEventHandler(f_FormClosing); } }
这个样子就可以用很短的代码控制很多个窗体,只要将所有的按钮的点击事件全部设置成为一个就可以了。不过由于对反射不是很了解,并不清楚这么做的优劣和效率,会不会出什么问题。
所以如果有哪位仁兄真的要用的话请自己注意。当然了,如果发现了什么问题也请告诉我。