【问题标题】:Parent form and child User Control communication in WinFormsWinForms 中的父窗体和子用户控件通信
【发布时间】:2014-07-01 18:22:21
【问题描述】:

我的表单带有一个菜单栏和下方的空间来显示我的控件。我的菜单栏中的一个按钮假设是一个打印按钮,它打印当前在我在表单中显示的用户控件中的图形。如果图表在打印按钮的事件处理程序中的表单上,我可以简单地调用

graph.printing.print(true)

这在我的情况下不起作用,因为图表在控件而不是表单中。

如何从包含的表单与用户控件通信并在需要时访问或传递其变量?我在表单底部还有一个状态栏,它也需要从用户控件中更新,但如果我只获得这一部分的帮助,我将能够处理这个问题。请记住,我还有另一个用户控件,我要添加到表单中,它还将包含一个图表,当按下打印按钮时,该图表需要与第一个控件上的另一个图表相同的处理。我计划将这两个换掉,这样我就有一个表单一次显示一个控件。

我从这个答案中得到了这个想法:https://stackoverflow.com/a/18191630/2567273,但经过进一步研究,我找不到任何人询问表单与其包含的控件之间的实际通信过程。

我认为this answer 与我正在寻找的内容很接近,但我认为它让我走上了使用面板而不是用户控件的道路。

输入此内容后,我注意到与我的问题最接近的答案可能是this,但该问题有孩子抚养事件,而父母在我让父母提出事件时做出回应,而父母必须从孩子那里获取信息.

【问题讨论】:

  • UC 需要的任何表单都应该通过属性或方法提供。当用户单击打印时,表单从控件中获取这个和那个并打印它因为它显然是由用户控件管理的数据,只需在表单调用的 UC 上公开一个 PrintGraph 方法跨度>
  • 那么如果你有另一个 UC,它也有一个你可以打印的图表,你只需要使用相同的方法或属性来实现它。对吗?
  • 是的 - 您拥有这些用户控件是有原因的:(理论上)它们是作为管理和显示 foobars 的专家而构建的。打印只是相关操作之一。卸载到表单可以工作,但是可能有很多东西要传回以供其他东西打印/处理/保存/上传......由于表单是菜单的宿主,他的角色可以像获取一样少命令并将其传递给相关的参与者。仅仅因为表单确实有菜单并不是打印的好理由。
  • 这也将使 UC 更加模块化,因为如果我制作它,它不会给出任何东西,所以只有我的 UC 执行相关操作,如打印或其他我必须做的事情。如果你把你的评论变成了答案,我会标记它。

标签: vb.net winforms forms


【解决方案1】:

考虑这一点的一种方式是角色。大概您构建了这个 UserControl 来处理与图形相关的数据的管理。因此,您可以将它们视为图形专家的角色。一旦你这样做了,打印它们实际上只是它应该做的另一件事。

另一方面,表单并不特别,因为它恰好接收到用户的打印命令。它在这方面的作用可能只是知道要联系哪个用户控件以及调用哪个方法:

 Sub PrintGraphMenuClick....

     Select Case something        ' determinant as to which UC to contact
         Case operation.Foo
             ucFoo.PrintGraph

         Case operation.Bar
             ucBar.PrintGraph

其他菜单选项,如ClearNewGraphSave 以及其他任何类似的方式。表单在这里的作用可能是接收用户的命令并将其传递给正确的控件,调用正确的方法并传递正确的参数——这不是一项简单的任务。

当然,除了MainMenu,用户控件还可以实现ContextMenu,甚至直接接收这些命令。

很多时候,将操作卸载到其他东西会导致许多属性、文件名、流等必须从这里移动到那里,从而变得繁重。在这种情况下,它不像 MainForm 有一些 UserControl 无法处理的打印机的特殊能力。

【讨论】:

  • 感谢您扩展您的评论!我知道现在该做什么了。我也会牢记 ContextMenu 的想法。不过,不要热衷于双重否定。
  • 这本来是为了强调,但也有点匆忙。祝你好运
【解决方案2】:

只有一个正确的解决方案:

1) 将事件添加到您的用户控件。

2) 当用户控件中发生特定“事情”时引发事件。

3) 将处理程序附加到表单代码中的事件。

4) 添加代码以更新事件处理程序中的底部栏。

【讨论】:

  • 这是我在更新状态栏时所希望的完美解决方案。谢谢你。可悲的是,我的问题是问你如何让表单与之对话并让“东西”脱离控制并松散耦合,因为我将拥有多个控件。
  • 请详细说明“谈话”和“东西”
  • (所有这些都可以在我的问题 btws 中找到)在我的表单中,我有一个菜单栏。其中一个菜单项是打印,用于打印在表单内的控件中找到的图形。如何将图表从控件传递到要打印的表单?
  • 为什么表单必须是打印其他数据的表单? “打印”是指在打印机上还是在其他控件上? @user2567273
  • 为什么不添加公开的 getter 属性来公开您想要公开的数据?
猜你喜欢
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
相关资源
最近更新 更多