读书人

单件模式的基Form两个继承它的窗口

发布时间: 2012-01-05 22:36:54 作者: rapoo

单件模式的基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());
}

读书人网 >C#

热点推荐