如何从静态方法(在winforms中)添加usercontrols?

如何从静态方法(在winforms中)添加usercontrols?,winforms,user-controls,this,static-methods,Winforms,User Controls,This,Static Methods,我正在尝试创建一个函数,将usercontrols添加到我的mainform中。我希望这个函数也可以从usercontrols本身获得,所以我将它设置为静态 我的问题是,当它是静态的时,我不能使用this.Controls.Add(ucontrol),我试图将其更改为ActiveForm.Controls.Add(ucontrol)但是ActiveForm为NULL并且没有控件属性(抛出异常) 更新#1:我最终在用户控件中执行了类似的操作: MainForm ref_to_mainform_to

我正在尝试创建一个函数,将usercontrols添加到我的mainform中。我希望这个函数也可以从usercontrols本身获得,所以我将它设置为静态

我的问题是,当它是静态的时,我不能使用
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的全部用途是作为一个菜单,在单击时显示其他usercontrol的按钮,那么从用户控件调用mainform上的函数(显示usercontrol的函数)仍然是“设计犯罪”吗?(就像我在“更新#1”中所做的那样)

通过将控件从用户控件添加到其父控件,您打破了关注点分离原则,并且将两个控件/表单紧密耦合。正如Hans Passant所建议的,您应该使用事件。请参阅:

这是Winforms提醒您做错事的一种方式。用户控件永远不应该向其父控件添加控件。引发一个事件。@HansPassant-你能解释一下为什么它错了吗?如果usercontrol的全部目的是作为一个菜单,在单击时显示其他usercontrols,那么从用户控件调用mainform上的函数(显示usercontrols的函数)仍然是“设计犯罪”吗?(就像我在《更新1》中那样)是的。您所做的是将两个控件紧密耦合。这意味着两个控件都不能单独使用,只能一起使用。您可以很好地将这两个控件合并到一个控件中,结果将是相同的。互联网上有很多关于创建松散耦合组件和分离关注点的好材料。我强烈建议你做一些研究,调查这些概念。