C# 如何实现一个窗体只能被实例一次

需求如下:1、我现在有几十个窗体,首先我不想给每一个窗体添加单例,也就是我不想修改原本窗体代码;2、此为主窗体菜单导航,MDI窗体,打开子窗体(同一种窗体只打开一次);3... 需求如下:
1、我现在有几十个窗体,首先我不想给每一个窗体添加单例,也就是我不想修改原本窗体代码;
2、此为主窗体菜单导航,MDI窗体,打开子窗体(同一种窗体只打开一次);
3、只想在主窗体部分实现类似单例模式效果。
4、回答如ShowDialog或者单例模式的答案不要再提;
5、希望大神能解答。
展开
 我来答
百度网友66a8d48e5
推荐于2016-07-07 · TA获得超过7687个赞
知道大有可为答主
回答量:3002
采纳率:12%
帮助的人:3844万
展开全部
从面向对象设计原则上来看,使用单例模式是最佳的实现方式。由于早期设计的遗漏等问题,会导致对项目中进行单例重构十分麻烦。

出于这种情况,最合适的方式建方你还是使用类似的单例模式,实例化对象本来就应该由类自象功能实现。不应该在外部实现。目前的建方是,设计一个单例模式的接口,及接口方法。然后让窗体类去继承。缺点是由于所有的窗体可能构造函数均为公开,不能做到具体的控制。虽然能解决不会遗漏哪个窗体未处理,但对于诸多窗体的修改仍然不是解决之道。

项目工期紧时,可以考虑使用外部实现。外部实现的原理就是在打开窗体时,使用一个函数进行打开,不要直接使用窗体的函数打开,当然也不是指每个窗体中去加一个成员方法。而是新建一个类。该类传入一个窗体类型,然后在程序域中查询该类是否被实现化。在一个appdomain中,所有的实例窗体都会出现在这里(模态除话框也在)。通过appdoamin可以查询到所有实例化后的窗体,那么利用查询出的所有窗体的运行态类型(用getType方法获得),与传入的类型进行对比,如果有存在,则直接返回即可,若不存在,则进行初始化。

虽然这样参解决当前的问题,但是这毕竟不是长久之计,也就是我们常说的技术债务,客户做完验证,在正式上线前使用singleton才是正道。总之这个债务是迟早要还的,至于在什么时间是由project manager自行决定。
百度网友f4e2724
2013-07-22 · TA获得超过298个赞
知道小有建树答主
回答量:372
采纳率:0%
帮助的人:168万
展开全部

你的意思就是子窗体只能打开一次,这个需要在你的MDI窗体增加打开子窗体判断。
代码:

        /// <summary>
        /// 判断窗体是否已打开
        /// </summary>
        private bool IsChildFormExist(Form frm)
        {
            if (frm == null) return false;
            foreach (Form childFrm in this.MdiChildren)
            {
                //用子窗体的Name进行判断,如果存在则将他激活
                if (childFrm.Text == frm.Text)
                {
                    childFrm.Activate();
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 打开窗口
        /// </summary>
        private void ShowForm(Form frm)
        {
            frm.MdiParent = this;
            frm.Show();
        }



调用事件里面:
if (!this.IsChildFormExist(this.frmGoodList))
            {
                this.frmGoodList = new SaasForce.StoreManager.Good.ListForm();
                this.ShowForm(this.frmGoodList);
            }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友115a69b
2013-07-22 · TA获得超过253个赞
知道小有建树答主
回答量:428
采纳率:50%
帮助的人:378万
展开全部
可以考虑使用扩展方法,只是调用的地方进行修改,不建议使用 标题来判断
虽然同一个窗体,标题很有可能不一样,如一些订单详情,标题可能带了订单号...
从业务和可读性来说也不应该这么做.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
清水栞
2013-07-22 · TA获得超过1547个赞
知道小有建树答主
回答量:1538
采纳率:50%
帮助的人:967万
展开全部

以前我用vb.net写过一个东西,思路说一下,不知道是不是你需求的

 

一个窗体加载器,类似工厂模式那样,由它负责调度你所用到的Form对象

 

加载器里有一个字典Dictionary[T,Form] where T : Form

 

请求时,传递目标窗体的类型泛型,然后加载器在字典中查询是否有实例,有就返回,没有就新建一个再返回

 

销毁的时候也一样

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
睿思博信
2013-07-22 · TA获得超过142个赞
知道答主
回答量:73
采纳率:0%
帮助的人:33.4万
展开全部
继承也不行吗?
追问
说说您的理解。
追答
所有窗体都继承自Form,你自己写一个MyForm加上你要的逻辑,再把每个窗体类声明从原来的基类Form改成你自己的MyForm
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式