【问题标题】:How to add usercontrols from a static method (in winforms)?如何从静态方法(在winforms中)添加用户控件?
【发布时间】:2012-07-20 11:11:13
【问题描述】:

我正在尝试创建一个将用户控件添加到我的主窗体的函数。我希望用户控件本身也可以使用此功能,因此我将其设为静态。

我的问题是当它是静态的时我不能使用this.Controls.Add(ucontrol);,我试图将其更改为ActiveForm.Controls.Add(ucontrol);,但是 ActiveForm 为 NULL 并且没有 Controls 属性(引发异常)。

更新#1:我最终在用户控件中做了这样的事情:

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

也许它会更好,但我仍然认为可以从静态方法访问主窗体?

更新 #2:

Application.OpenForms["FormName"]

从静态方法工作。

我仍然试图找出用户控件的全部目的是否用作带有按钮的菜单,在点击时显示其他用户控件,在 mainform 上调用函数(显示用户控件的函数)是否仍然是“设计犯罪”用户控件? (就像我在“更新 #1”中所做的那样)

【问题讨论】:

  • 这是 Winforms 提醒您做错了的方式之一。用户控件应该从不向其父级添加控件。引发事件。
  • @HansPassant - 你能解释一下为什么错了吗?

标签: winforms user-controls this static-methods


【解决方案1】:

通过将用户控件中的控件添加到其父控件,您打破了关注点分离原则,并且紧密耦合了两个控件/表单。正如 Hans Passant 所建议的,您应该使用事件。请参阅: best practices to call methods in the parent form and access gui elements in parent form in c#

【讨论】:

  • 如果用户控件的全部目的是作为一个带有按钮的菜单,在点击时显示其他用户控件,在 mainform 上调用一个函数是否仍然是“设计犯罪”(一个显示usercontrols) 来自用户控件? (就像我在“更新 #1”中所做的那样)
  • 是的。您正在做的是紧密耦合两个控件。这意味着这两个控件都不能单独使用,只能一起使用。您很可能将这两个控件合并到一个控件中,结果将是相同的。互联网上有很多关于创建松散耦合组件和关注点分离的好材料。我强烈建议您进行一些研究并调查这些概念。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 2016-08-02
相关资源
最近更新 更多