2013-09-26 52 views
2

我的C#.NET Windows應用程序動態創建一堆沒有名字的形式和沒有國界的,這工作得很好,但後來我需要找到這些表格並設置他們是最頂部形式。我目前的邏輯是在創建時將myForm.Handle寫入字符串,以便稍後可以引用該句柄。鑄造從窗口的形式處理

而這正是它失敗了,當我準備將其設置爲最頂層的窗口,我這樣做:

Form myForm = Form.FromHandle(sFormHandle); 
if (myForm != null) { myForm.TopMost = true; } 

sFormHandle是一個字符串,它需要一個的IntPtr,我該如何轉換它,或以其他方式做到這一點?

非常感謝。

+0

它是否拋出異常?如果是這樣,什麼是例外?關於無法投射的事情? – Brian

+3

不要這樣做,當您將TopMost屬性設置爲true時,句柄值將更改*。而不是存儲字符串或IntPtr,而是存儲對Form的引用。 –

+0

不知道句柄的變化,我現在將表單添加到列表中,並在稍後引用它,它做到了這一點。謝謝。 –

回答

4

窗體上的句柄屬性是一個IntPtr。 爲什麼你將它存儲爲一個字符串?

這裏的解決方案是將句柄存儲爲一個IntPtr,不是一個字符串。 比這更好,如果這是所有.net窗體窗體代碼,爲什麼不保持參考形式而不是句柄?

編輯:增加重點。來自社區的共識似乎是應該保留對錶格的引用,並且不應該依賴句柄。

+0

強調「參考表格」...句柄可以改變。 – DonBoitnott

+0

是的,我最初引用了'解決方案',但認爲這太過於隱晦。儘管我完全同意@DonBoitnott,但我可以看到沒有很好的理由在這裏使用表格的引用。 –

+0

我相信手柄是尋找表格最安全的方式。我現在將表格添加到列表中「列表

formInstances = new List ();」並在需要時參考。感謝您的高舉。 –

0

表格FR =(表格)Form.FromHandle(新的IntPtr(int.Parse( 「0」)));

和直接refrence的提防一類... 你,因爲COM級車型 如果你使用直接refrence一類, 類不會卸載,直到所有的refrences的最好嘗試WeakRefrence被刪除!