首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

单件模式的基Form,两个继承它的窗口,实例化时一个窗口,另一个窗口无法实例化了。解决方案

2012-01-05 
单件模式的基Form,两个继承它的窗口,实例化时一个窗口,另一个窗口无法实例化了。namespaceCustomForm{publi

单件模式的基Form,两个继承它的窗口,实例化时一个窗口,另一个窗口无法实例化了。
namespace   CustomForm  
{
        public   partial   class   BaseForm   :   DockContent   //基窗口   使用了http://sourceforge.net/projects/dockpanelsuite/   控件
        {
                private   static   BaseForm   instance   =   null;
                protected   override   bool   ProcessDialogKey(Keys   keyData)
                {
                        if   ((ActiveControl   is   TextBox   ||   ActiveControl   is   ComboBox)   &&
                                keyData   ==   Keys.Enter)
                        {
                                keyData   =   Keys.Tab;
                        }
                        return   base.ProcessDialogKey(keyData);
                }
                public   BaseForm()
                {
                        InitializeComponent();
                }
                public   static   BaseForm   Instance(Form   fm1,   Type   FormType,   DockPanel   dockpanel,bool   dialog)
                {
                        if   (instance   ==   null)
                        {
                                instance   =   (BaseForm)System.Activator.CreateInstance(FormType);
                                instance.MdiParent   =   fm1;
                                if   (dialog   ==   true)
                                        instance.ShowDialog();
                                else
                                        instance.Show(dockpanel);
                                return   instance;
                        }
                        else
                        {


                                if   (dialog   ==   false)
                                {
                                        instance.DockTo(dockpanel,   DockStyle.Fill);
                                        instance.Activate();
                                }
                                return   null;
                        }
                }

                private   void   BaseForm_FormClosing(object   sender,   FormClosingEventArgs   e)
                {
                     
                          //instance.Dispose();
                          instance   =   null;
                }
        }
}
子窗口一:
namespace   Security
{
        public   partial   class   Module   :   CustomForm.BaseForm
        {
                public   Module()
                {
                        InitializeComponent();
                }

                private   void   Module_Load(object   sender,   EventArgs   e)
                {
                        DAL.SecurityModule.GetModuleTree(treeView1.Nodes,   0);
                }
        }
}
子窗口二:
namespace   Security
{
        public   partial   class   SecurityManage   :   CustomForm.BaseForm
        {
                public   SecurityManage()
                {
                        InitializeComponent();
                }
}
调用:
                private   void   button1_Click(object   sender,   EventArgs   e)
                {
                        Security.SecurityManage   f2   =   (Security.SecurityManage)Security.SecurityManage.Instance(this.MdiParent,   typeof(Security.SecurityManage),dp1,false);


                }

                private   void   button2_Click(object   sender,   EventArgs   e)
                {
                        Security.Module   formModule   =   (Security.Module)Security.Module.Instance(this.MdiParent,   typeof(Security.Module),   dp1,   false);
                }

点击一个Button,实例化一个继承窗口后,再点别一个Button,仍然是对已经实例化的那个窗口操作。
这段代码要怎么改,大家指点一下,谢谢。

[解决办法]
Hashable instance =New Hashtable
public static BaseForm Instance(Form fm1, Type FormType, DockPanel dockpanel,bool dialog)
{
if (instance[FormType] == null)
{
BaseForm frm= (BaseForm)System.Activator.CreateInstance(FormType);
frm.MdiParent = fm1;
if (dialog == true)
frm.ShowDialog();
else
frm.Show(dockpanel);
instance.Add(FormType,frm);
return frm;
}
else
{
if (dialog == false)
{
BaseForm frm =(BaseForm)instance[FormType];
frm.DockTo(dockpanel, DockStyle.Fill);
frm.Activate();
}
return null;
}
}
private void BaseForm_FormClosing(object sender, FormClosingEventArgs e)
{
instance.Remove(sender.GetType());
}

热点排行