2017-09-27 106 views
-3

我在我們的應用程序中有一些用戶控件,它們引用他們正在坐的窗體以獲取一些初始化值。根據不同的表單,他們需要不同的行爲。在.designer.cs中創建控件

因此,用戶控制捕獲OnLoad和ParentChanged事件,並且您FindForm可以訪問它們所在的表單......並且所有這些都已經有好幾年了。

但是,上週我們開始遇到一些控件沒有正確初始化的問題,並且經過大量搜索後,我可以看到發生的情況是,如果控件位於容器上而不是直接放在窗體上,那麼當控件的ParentChanged事件觸發,它可能是該容器尚未添加到窗體,因此FindForm不起作用。

奇怪的是,這只是剛剛開始發生,似乎自從我們升級到最新的VS後,當編輯後保存表單時,設計師正在大規模地改變控件的創建順序,有時候這導致失敗。

有誰知道VS設計器行爲是否發生了變化?而且,如果有無法控制設計器文件中的表單控件的創建順序?

我可以手動編輯設計器文件來修復,但是在重新保存時,VS將它重新放回原樣。

+0

依靠VS工具或運行時對自動生成文件的任何操作一直存在風險。無論答案如何,如果它再次發生變化呢?您可以將調用重定位到父窗體依賴代碼到生命週期的後期,如form_load?可以像foreach控件一樣簡單... control.visitparent(this)... – dlatikay

+0

'... Designer.cs'的第一行說:「對此文件的更改可能導致不正確的行爲並將丟失如果代碼被重新生成。「你需要重新考慮你的設計。 – Xiaoy312

+0

@ Xiaoy312不一定;下面的答案實際上就是生成的,並且只在InitializeComponent方法的上面包含一條消息。 – Marisa

回答

-1

因此,雖然這可能適合您一段時間,但核心問題在於包含在每個Designer.cs文件中的方便的消息。

/// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 

實際上,這條消息應該真的適用於Designer.cs文件中的任何東西。我會溫和地建議你應該仔細看看你的代碼,以及你爲什麼要做你正在做的事情,並儘快改變它,不要依賴於Designer.cs文件的修改。