日期:2014-05-18  浏览次数:21090 次

MDI子窗体无法被激活(多个子窗体打开)
有三个窗体,其中主窗体:Form1,子窗体:Form2、Form3

在Form1中点击按钮btnform2打开子窗体Form2,点击按钮btnform3打开子窗体Form3,其中按钮btnform2触发事件的代码如下:

private bool remark = true;
private void btnform2_Click(object sender, EventArgs e)
  {
  Form2 Data = new Form2(); 
  if(remark==true)
  {
  Data.MdiParent = this;
  Data.Show();
  remark=false;
  }
  else
  {
  Data.Activate();
  }
  }

 

以上代码达到不重复打开子窗体的效果,假设先打开子窗体Form2,然后打开Form3(此时Form3处于激活状态),当再次点击按钮btnform2时,
子窗体Form2却没有被激活,也没有显示在所有打开的子窗体的最前面。如果解决这个问题呢? 


------解决方案--------------------
private bool remark = true;
 Form2 Data = new Form2();
private void btnform2_Click(object sender, EventArgs e)
{

if(remark==true)
{
Data.MdiParent = this;
Data.Show();
remark=false;
}
else
{
Data.Activate();
}
}
------解决方案--------------------
当你第二次按btnform2时,又实例化了一个Form2。而remark==False,因此它又不显示。所以再Active也没用。
如果要不让它重复打开子窗口可以用“单件模式”。网上例子挺多的。
简单的单价模式:
public partial class Form1 : Form
{

#region 构造方法
/// <summary>
/// Form1构造方法
/// </summary>
private Form1()
{
}
#endregion

#region Form1单例模式
/// <summary>
/// Form1的单例实例
/// </summary>
private volatile static Form1 instance = null;

/// <summary>
/// 本类型的单例属性
/// </summary>
public static Form1 Instance
{
get
{
if (instance == null||instance.IsDisposed)
{
instance = new Form1();
}
return instance;
}
}
#endregion
}

调用
Form1.Instance.MdiParent = MdiForm;
Form1.Instance.Show();
------解决方案--------------------
private Form ExistedForm(Type type)
{
foreach (Form form in MdiChildren)
{
if (form.GetType() == type)
return form;
}
return null;
}