天天看點

c#判斷打開的窗體:MDI和非MDI

<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