CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

如何防止Form被多次实例化(不一定是MDI窗体)

楼主fuanwei(草原上狂奔的蜗牛)2006-07-04 10:37:56 在 .NET技术 / C# 提问

如何防止Form被多次实例化(不一定是MDI窗体)  
  问题点数:20、回复次数:17Top

1 楼mapserver(杨东 http://mapserver.cnblogs.com)回复于 2006-07-04 10:41:50 得分 5

在窗体里加一个静态变量,实例化的时候就把这个静态变量置为true,下次实例化的时候判断这个静态变量。Top

2 楼NaZiChong(那子虫)回复于 2006-07-04 10:43:15 得分 10

//声明类成员  
  Form   frm=null;  
  //在类中使用  
  if   (frm==null   ||   frm.IsDisposed)       frm=new   Form();  
   
  frm.Show();  
  ......Top

3 楼liaodanz(雪宇)回复于 2006-07-04 10:44:58 得分 5

private   static   newpaper   newpaper;         //静态变量,保存唯一实例  
   
  private   void   menunew_Click(object   sender,   System.EventArgs   e)  
  {  
  if(newpaper==null   ||   newpaper.IsDisposed)   //第一次实例化也好,被关了也好,都重新实例化  
  {  
  newpaper   =   new   newpaper();  
  newpaper.Tag=this;  
  newpaper.Show();  
  }  
  else  
  {  
  newpaper.Activate();  
                    newpaper.WindowState=System.Windows.Forms.FormWindowState.Normal;  
  }  
  }Top

4 楼Knight94(愚翁)回复于 2006-07-04 10:45:17 得分 0

参看  
  http://blog.csdn.net/Knight94/archive/2006/05/24/752783.aspxTop

5 楼wwfy(我舞飞扬)回复于 2006-07-04 10:45:24 得分 0

很多办法吧。  
  可以在类型里面增加两个静态属性,  
  一个记录是否已经存在类型的实例,一个记录实例的引用。  
  实例化类型的时候检查一下类型的静态属性,如果有实例了,直接引用显示。  
  如果没有,实例化类型,并将类型的实例化属性值为true,  
  将实例的引用赋予类型的另外一个属性。  
  关闭form的实例时候将类型的实例化属性值为false,将类型的另外一个属性值为null。  
   
  这样应该可以。  
  Top

6 楼xiaozhimin1978(小灰狼)回复于 2006-07-06 16:22:41 得分 0

用单一模式  
   
   
  1、构造方法私有  
  2、设置一个静态、私有的窗体变量  
  3、加一个静态、公共的   Get   属性,可以获得对这个私有变量的引用  
   
  public   class   MyForm   :   System.Windows.Forms.Form{  
          private   static   MyForm   _instance   =   new   MyForm();  
          public   static   MyForm   Instance{  
                  get{  
                          if(_instance   ==   null   ||   _instance.IsDisposed)  
                                  _instance   =   new   MyForm();  
                          return   _instance;  
                  }  
          }  
          public   MyForm(){  
          //......  
          }  
  }  
  Top

7 楼zhzuo(秋枫)回复于 2006-07-07 13:39:08 得分 0

单件模式  
  http://birdshover.cnblogs.com/archive/2006/06/15/424656.htmlTop

8 楼gengyu(八爪鱼)回复于 2006-09-06 16:37:44 得分 0

///   <summary>  
                  ///   查询MDI子窗体是否存在  
                  ///   </summary>  
                  ///   <param   name="childFrmName"></param>  
                  ///   <returns></returns>  
                  private   bool   checkChildFrmExist(string   childFrmName)  
                  {  
                          foreach   (Form   childFrm   in   this.MdiChildren)  
                          {  
                                  if   (childFrm.Name   ==   childFrmName)   //用子窗体的Name进行判断,如果存在则将他激活  
                                  {  
                                          if   (childFrm.WindowState   ==   FormWindowState.Minimized)  
                                                  childFrm.WindowState   =   FormWindowState.Normal;  
                                          childFrm.Activate();  
                                          return   true;  
                                  }  
                          }  
                          return   false;  
                  }  
   
   
                  //---------------------------显示子窗体--------------  
                  private   void   toolStripButton1_Click(object   sender,   EventArgs   e)  
                  {  
                          //通过窗体名称查询该窗体是否已经存在,如存在则显示,否则就新创建一个  
                          if   (this.checkChildFrmExist("FrmMain")   ==   true)  
                          {  
                                  return;  
                          }  
                          FrmMain   frmm   =   new   FrmMain();  
                          frmm.MdiParent   =   this;  
                          frmm.size   =   this.ClientSize;  
                          frmm.Show();  
                  }Top

9 楼xfary(风飘摇)回复于 2006-09-06 16:41:48 得分 0

Use   "   Single   Pattern   "Top

10 楼terryghz()回复于 2006-09-06 16:57:06 得分 0

goodTop

11 楼delicioustian(天天酷鱼)回复于 2006-09-07 12:57:37 得分 0

谢谢楼上几位朋友。。我也碰到这问题。通过你们的方法,我解决了问题。Top

12 楼zhongwanli(㊣【为了老婆,二次重构____然后升★★】㊣)回复于 2006-09-07 13:03:01 得分 0

建立一个容器去管理Top

13 楼jackyped(MSN: jpu_jacky@eyou.com)回复于 2006-09-07 14:19:42 得分 0

.NET中的设计模式二:单件模式  
  --------------------------------------------------------------------------------  
   
  单件模式(Singleton)是一个非常简单的模式,这是我第一个理解并且能运用的模式。有时候模式的复杂程度并不在于本身,而是由于他的应用目的。最初的时候面对一个模式经常充满了困惑,一个简单的调用为什么要搞的如此复杂?为什么要建立这么多类,只是为了打开一个文件。  
  通常说来学习一个模式是一个接受、认可、领会的过程。接受:了解模式的结构,了解实例的意义;认可:认可该模式在实际工程中的作用和可行性;领会:将模式应用到开发过程中。  
  而模式的应用目的说到底无非是为了降低模块之间在时间和空间上的耦合程度,以此提高模块的复用性,降低出错的概率。  
  单件模式  
  Singleton模式是一个较为简单的模式,下面的代码就可以建立一个Singlton模式的例子,这是一个写系统日志的类。  
  public   class   LogWriter  
  {  
          //申明一个静态的变量,类型为类本身  
          private   static   LogWriter   _instance   =   null;  
     
          //将类的构造函数私有化,使得这个类不可以被外界创建  
          private   LogWriter()  
          {  
          }  
     
          //提供静态的方法,创建类的实例  
          public   static   LogWriter   GetInstance()  
          {  
                  if   (_instance   ==   null)  
                  {  
                          _instance   =   new   LogWriter();  
                  }  
                  return   _instance;  
          }  
     
          //下面实现类的其他功能  
          //....  
  }  
  调用者不可以通过new的形式得到Singleton的实例,调用的例子如下:  
  LogWriter   log   =   LogWriter.GetInstance();  
  log.Debug("hello   world");  
     
  实际应用  
  很容易想象,单件模式适用于下面的情况:整个系统中某个对象是唯一的,或者是有固定数量的。比如数据库连接,配置文件,等等……  
  模式是一种程序员间的约定术语,语言可以成为思维的基础。有了这样的语言,一些复杂的概念就变得容易交流了。比如设计人员只要说到,某个类是一个单件模式,是一个Singleton,程序员听见以后就至少应该明白这个类的调用方式了,而不用再详细的说明。Top

14 楼zxcayumi()回复于 2006-09-12 13:53:21 得分 0

http://www.syncfusion.com/FAQ/WindowsForms/FAQ_c4c.aspx#q824qTop

15 楼gengyu(八爪鱼)回复于 2006-09-13 19:41:05 得分 0

///   <summary>  
                  ///   查询MDI子窗体是否存在  
                  ///   </summary>  
                  ///   <param   name="childFrmName"></param>  
                  ///   <returns></returns>  
                  private   bool   checkChildFrmExist(string   childFrmName)  
                  {  
                          foreach   (Form   childFrm   in   this.MdiChildren)  
                          {  
                                  if   (childFrm.Name   ==   childFrmName)   //用子窗体的Name进行判断,如果存在则将他激活  
                                  {  
                                          if   (childFrm.WindowState   ==   FormWindowState.Minimized)  
                                                  childFrm.WindowState   =   FormWindowState.Normal;  
                                          childFrm.Activate();  
                                          return   true;  
                                  }  
                          }  
                          return   false;  
                  }  
   
  使用    
                  private   void   toolStripButton3_Click(object   sender,   EventArgs   e)  
                  {  
                          //通过窗体名称查询该窗体是否已经存在,如存在则显示,否则就新创建一个  
                          if   (this.checkChildFrmExist("FrmStatistics")   ==   true)  
                          {  
                                  return;  
                          }  
                          //   如果该窗体不存在则新生成一个窗体  
                          FrmStatistics   frms   =   new   FrmStatistics();  
                          frms.Show();  
                  }Top

16 楼bill024(小黑点,对不起,走好!)回复于 2006-09-13 20:28:29 得分 0

关注!Top

17 楼lunice()回复于 2006-11-14 20:33:15 得分 0

markTop

相关问题

关键词

得分解答快速导航

  • 帖主:fuanwei
  • mapserver
  • NaZiChong
  • liaodanz

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo