使用反射打开窗体,并控制一个窗体只能打开一个

刚刚开始做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);
        }
    }

这个样子就可以用很短的代码控制很多个窗体,只要将所有的按钮的点击事件全部设置成为一个就可以了。不过由于对反射不是很了解,并不清楚这么做的优劣和效率,会不会出什么问题。
所以如果有哪位仁兄真的要用的话请自己注意。当然了,如果发现了什么问题也请告诉我。



posted @ 2012-10-18 15:13  古兰色回忆  阅读(508)  评论(0编辑  收藏  举报