日期:2014-05-17  浏览次数:20872 次

一个小的方案求解(关于多窗口同时编辑)
一个数据列表,每行数据有一唯一标识ID,点击一行可进入修改界面(frm_Edit),
现在需要可以同时打开多编辑界面,以标识ID来过滤相关详细内容。
现在项目设计的情况如下:
所有的界面Form继承自一个baseForm.
如何最简洁的完成这个功能?

我的部分实现:
ImspGlobal.listFormID 为全局List<string>
C# code

        //没有则初始化返回一个编辑框,有则直接返回存在的编辑框
        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;
        }




界面上部分代码:
C# code

        //存在直接获取焦点,不存在,添加其编号入集合并打开显示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刷新问题,我注册了个事件来处理,那很多编辑界面都要加,有更简洁的方法吗?

------解决方案--------------------
不建议继承,而应该使用用户控件。
------解决方案--------------------
问题搞得很复杂噢,表示鸭梨很大...
能否先描述需求,然后再貼代码
感觉你的设计比较凌乱...
------解决方案--------------------
C# code
        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();
                }
            }
        }

------解决方案--------------------
给个思路:
1、编辑窗体需要增加一个属性DataID,用于标识数据的唯一值;
2、当父窗体需要编辑时,判断打开的编辑窗体有无DataID相同的,若有,将其激活,否则。创建编辑窗体,赋值,包括刷新父窗体的回调;
3、在父窗体中定义回调函数原型,刷新回调函数传回的DataID值那行的数据;

我觉得每个列表界面只需要2个窗体就可以了,一个父窗体,一个编辑窗体。