2012-07-20 26 views
0

我正在嘗試創建一個將usercontrols添加到我的mainform的函數。我想這個函數也可以從usercontrols自己獲得,所以我把它變成靜態的。如何從靜態方法添加usercontrols(以winforms形式)?

我的問題是,當它是靜態的我不能使用this.Controls.Add(ucontrol);,我試圖將其更改爲ActiveForm.Controls.Add(ucontrol);但後來ActiveForm是NULL,並沒有控件屬性(引發異常)。

更新#1:最後我做這樣的事情的用戶控件中:

MainForm ref_to_mainform_to_gain_access_to_functions = (MainForm)Parent;  
ref_to_mainform_to_gain_access_to_functions.DisplayControl(ucontrol);   

也許它甚至更好,但我仍然認爲它可能有從靜態方法訪問MainForm的?

更新#2:

Application.OpenForms["FormName"] 

從靜態方法奏效。

我仍然試圖找出,如果usercontrol整個目的是作爲一個菜單與按鈕,顯示其他usercontrols onclick,它仍然是一個'設計犯罪'調用mainform函數(一個函數顯示usercontrols)從用戶控制? (就像我在'更新#1'中所做的那樣)

+2

這是Winforms提醒您您做錯了一種方式之一。用戶控件應該永遠不會將控件添加到其父項中。舉辦活動。 – 2012-07-20 11:51:09

+0

@HansPassant - 你能解釋一下爲什麼這麼錯? – BornToCode 2012-07-20 11:53:23

回答

1

通過將控件從用戶控件添加到其父項中,您打破了關注點分離原則,並且緊密地耦合了這兩個控件/窗體。正如Hans Passant所建議的,你應該使用事件。請參閱: best practices to call methods in the parent form and access gui elements in parent form in c#

+0

如果用戶控件的整個目的是作爲一個菜單來顯示其他用戶控件onclick,那麼從用戶控件調用mainform(一個顯示usercontrols的函數)上的函數仍然是「設計犯罪」嗎? (就像我在'更新#1'中所做的那樣) – BornToCode 2012-07-22 12:56:17

+0

是的。你在做什麼是緊密耦合兩個控件。這意味着這兩個控件都不能單獨使用,只能一起使用。你可能很好地將這兩個控件合併成一個控件,結果也是一樣的。互聯網上有很多關於創建鬆散耦合組件和關注點分離的好材料。我強烈建議你做一些研究並調查這些概念。 – Bartosz 2012-07-23 10:29:41

相關問題