问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

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

发布网友 发布时间:2023-03-03 03:09

我来回答

5个回答

热心网友 时间:2024-04-24 11:19

从面向对象设计原则上来看,使用单例模式是最佳的实现方式。由于早期设计的遗漏等问题,会导致对项目中进行单例重构十分麻烦。

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

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

虽然这样参解决当前的问题,但是这毕竟不是长久之计,也就是我们常说的技术债务,客户做完验证,在正式上线前使用singleton才是正道。总之这个债务是迟早要还的,至于在什么时间是由project manager自行决定。

热心网友 时间:2024-04-24 11:19

你的意思就是子窗体只能打开一次,这个需要在你的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);
            }

热心网友 时间:2024-04-24 11:20

可以考虑使用扩展方法,只是调用的地方进行修改,不建议使用 标题来判断
虽然同一个窗体,标题很有可能不一样,如一些订单详情,标题可能带了订单号...
从业务和可读性来说也不应该这么做.

热心网友 时间:2024-04-24 11:20

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

 

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

 

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

 

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

 

销毁的时候也一样

热心网友 时间:2024-04-24 11:21

继承也不行吗?追问说说您的理解。

追答所有窗体都继承自Form,你自己写一个MyForm加上你要的逻辑,再把每个窗体类声明从原来的基类Form改成你自己的MyForm

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
梦幻西游手游 梦幻西游手游超级泡泡六技能上什么书? ...改造者的要塞不要爆炸时说:可惜我们不能超进化.为什么? 宝可梦剑盾满级怎么进化介绍_宝可梦剑盾满级怎么进化是什么 异山梨醇注意事项 外资企业未验资如何处理 醉酒游戏二攻略第20关最囧游戏2第21关找到圆形如何过第21关攻略_百度知... 家人吃饭发朋友圈优雅句子图片 当事人取保候审还需要开庭吗 2023年中级会计报名需要工作证明吗 2024年中级会计报名需要公司开工作证明吗 大合唱什么意思? 摩尔庄园买的骑士卡牌在哪里兑换 摩尔庄园大电影3怎么兑换蛞蝓丸子 helm 部署 grafana 梦见酒坛子漏酒 1匹空调制热耗电量是多少? 摩尔庄园的猪猪彩票在哪里兑换 梦见自己送礼的烟酒被偷 重庆身份证办理一般多少天能拿到? 烧烤料配方有哪些 梦见鞋和啤酒被偷了什么意思 摩尔庄园神奇密码兑换的东西在哪里 整理床的英文 整理床铺用英语如何说 整理床铺用英语怎么说 梦见我与死去的人暖味 梦见苞谷酒 蜿字除了蜿蜒还能组那些词 汉字肴怎么读 摩尔庄园百花币怎么兑换物品 儿童简笔画龙猫皮卡丘 小米手环能测高血压吗? 我的舌头怎么好白呢? 我马上就能拿到摩尔庄园HD的内测码了,我该去哪里输入进入游戏呢 战地1值得入手吗 抑郁症需要多长时间才能确诊 一般抑郁情绪会持续多久 天津在职研究生招生相关信息有哪些 05老款飞度后尾翼怎么拆 天津财经大学在职研究生一般都是什么时候招生? 天津市,在职研究生去哪报名好 摩尔庄园激活码怎样领取? 从西安火车站到陈家寺坐几路车 摩尔庄园步步生莲怎么兑换? 杉字开头的成语 交虬_意思是什么 梦见有男人调戏非礼我 对于飞镖我是个门外汉!在这里请问一下怎样安装飞镖尾翼?谢谢了 GRE考哈佛大学,普林斯顿大学,马什理工大学 录取分数多少 。所以想去美国深造哈佛等国想的水 卡伦马什几岁了
  • 焦点

最新推荐

猜你喜欢

热门推荐