一个数据列表,每行数据有一唯一标识ID,点击一行可进入修改界面(frm_Edit),
现在需要可以同时打开多编辑界面,以标识ID来过滤相关详细内容。
现在项目设计的情况如下:
所有的界面Form继承自一个baseForm.
如何最简洁的完成这个功能?我的部分实现:
ImspGlobal.listFormID 为全局List<string>        //没有则初始化返回一个编辑框,有则直接返回存在的编辑框
        public static Frm_base OpenSomeForm<T>(object[] parameters) where T : Frm_base
        {
            Frm_base openForm = null;
            object obj = parameters.Count() > 0 ? parameters[parameters.Count() - 1] : null;
            if (!ImspGlobal.listFormID.Contains(obj.ToString()))
            {
                openForm=(T)Activator.CreateInstance(typeof(T), parameters);
            }
            else 
            {
                foreach (Form form in Application.OpenForms)
                {
                    if(form is T)
                    {
                        var data = form as T;
                        if (data.FormCode == obj.ToString())
                            openForm = data;
                    }
                }
            }
            return openForm;
        }界面上部分代码:        //存在直接获取焦点,不存在,添加其编号入集合并打开显示listFormID为Frm_base的附加属性
        private void btnShow_Click(object sender, EventArgs e)
        {
            var frmEdit = (Frm_Edit)ImspPubFun.OpenSomeForm<Frm_Edit>(new object[] { orderId, null, "06001" + (orderId).ToString() });
            if (!ImspGlobal.listFormID.Contains("06001" + (orderId).ToString()))
            {
                ImspGlobal.listFormID.Add("06001" + (orderId).ToString());
                frmEdit .OnFormClosed += new EventHandler<CloseFormArgs>(frm_OnFormClosed);
                frmEdit .Show();
            }
            else
            {
                frmEdit .Activate();
            }
        }我觉得自己想法有些乱,功能可以实现,但这样的界面很多,修改地方也多,特别是那个关闭frmEdit刷新问题,我注册了个事件来处理,那很多编辑界面都要加,有更简洁的方法吗?

解决方案 »

  1.   


    devmiao
    (苏小喵)能说的详细点吗?
    我所有的业务界面都继承自这个基础界面。
    主要问题是,这个OpenSomeForm方法之前是无返回值,直接显示界面的,但因为保存成功后主界面刷新问题,所以返回一个编辑界面。导致代码增加了很多。
      

  2.   

            private void MainForm_Load(object sender, EventArgs e)
            {
                listBox1.Items.AddRange(new String[] { "1", "2", "a", "b" });
            }        private void listBox1_DoubleClick(object sender, EventArgs e)
            {
                String strName = listBox1.Text;
                if (!String.IsNullOrEmpty(strName))
                {
                    Boolean bOpen = false;
                    foreach (Form f in Application.OpenForms)
                    {
                        if (f.Name == strName)
                        {
                            bOpen = true;
                            f.BringToFront();
                            break;
                        }
                    }                if (!bOpen)
                    {
                        Form f = new Form();
                        f.Name = strName;
                        f.Text = strName;
                        f.Show();
                    }
                }
            }
      

  3.   


    SocketUpEx我有20个左右这样的列表界面,每个界面这么加代码有点恼火啊。
    而且之后关闭此编辑界面,主界面要刷新数据的。
      

  4.   

    给个思路:
    1、编辑窗体需要增加一个属性DataID,用于标识数据的唯一值;
    2、当父窗体需要编辑时,判断打开的编辑窗体有无DataID相同的,若有,将其激活,否则。创建编辑窗体,赋值,包括刷新父窗体的回调;
    3、在父窗体中定义回调函数原型,刷新回调函数传回的DataID值那行的数据;我觉得每个列表界面只需要2个窗体就可以了,一个父窗体,一个编辑窗体。