2012-07-20 24 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

相关问题