<a>1,MDI類型</a>
在打開事件中直接檢測是否已經打開此MDI窗體
// 是否已經打開了?(用循環來判斷)
foreach (Form childrenForm in this.MdiChildren)
{
//檢測是不是目前子窗體名稱
if (childrenForm.Name == "子窗體名稱")
//是的話就是把他顯示
childrenForm.Visible = true;
//并激活該窗體
childrenForm.Activate();
return;
}
//下面是打開子窗體
Form1 childrenForm = new Form1();
childrenForm.MdiParent = this;
childrenForm.Show();
childrenForm.WindowState = FormWindowState.Maximized;
-------------------------------------------------------
這樣也行:
frmPurvey frmp = new frmPurvey();//建立要打開的窗體對象
bool isOpen = true;
foreach (Form frm in this.MdiChildren)//周遊已打開的MDI
{
if (frm.Name == frmp.Name)
frmp.Activate();//賦予焦點
frmp.WindowState = FormWindowState.Maximized;//設定窗體最大化
isOpen = false;
break;
}
if (isOpen)//如果沒有找到相同窗體則打開新窗體
frmp.MdiParent = this;//設定父窗體
frmp.Show();
<a>2,非MDI</a>
利用.net Framework 2.0新加的Application.OpenForms集合解決:
bool isOpen = false; //初始為未打開狀态
Form2 frm2= new Form2();
foreach (Form frm in Application.OpenForms) //周遊已打開視窗
if (frm.name == frm2.name)
//如果此視窗已打開
isOpen = true;
if (!isOpen) //如果窗體未打開,顯示窗體
frm2.Show();
開心了一會兒,又發現:當打開其它窗體後,再想使用這個Form2時,按按鈕無法激活它了,郁悶。
加上
else
frm2.Activate();
沒用,還是無法激活,又在網上找了好久,還是沒找到合用的。沒法了,不能偷懶了。
分析一下發現,我在 foreach 之前建立了窗體對象:Form2 frm2= new Form2(); 然後下面代碼再進行判斷。那不就成了每次Activate()時都是對一個建立的對象進行激活嗎,這樣肯定與原來已經打開的窗體無關啊,原因應該在這兒。
修改代碼為:
if (frm is Form2)
//如果此視窗已打開,則激活
frm.Activate();
if (!isOpen) //如果窗體未打開,建立窗體對象并顯示
OK,成功!!!
本文轉自 huohe2009 51CTO部落格,原文連結:http://blog.51cto.com/zhaojie/904565