WinForms中的父窗体和子用户控件通信

时间:2014-07-01 18:22:21

标签: vb.net winforms forms

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

graph.printing.print(true)

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

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

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

我认为this answer接近我正在寻找的东西,但我认为这会让我走上使用面板而不是用户控件的道路。

输入后我注意到我的问题最接近的答案可能是this,但是这个问题让孩子提出事件而父母在我父母提出事件时做出回应而父母必须从中获取信息孩子。

2 个答案:

答案 0 :(得分:0)

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

1)向您的用户控件添加一个事件。

2)在用户控件中发生特定“事物”时提升事件。

3)在表单代码中为事件附加处理程序。

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

答案 1 :(得分:0)

考虑这一点的一种方法是角色。据推测,您构建了此UserControl来处理与图形相关的数据的管理。因此,您可以在图形专家的角色中考虑它们。一旦你这样做,打印它们实际上只是应该做的一件事。

另一方面,表单并不特别,因为它碰巧得到了用户打印的命令。它在这方面的作用可能只是知道要联系的用户控件和要调用的方法:

 Sub PrintGraphMenuClick....

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

         Case operation.Bar
             ucBar.PrintGraph

其他菜单选项,例如ClearNewGraphSave以及其他任何相似的菜单选项。 Form的角色可能是从用户接收命令并将其传递给正确的控件,调用正确的正确方法并传递正确的参数 - 这不是一项简单的任务。

当然,而不是MainMenu,usercontols可以替代实现ContextMenu,甚至可以直接接收这些命令。

经常将操作卸载到其他地方导致如此多的属性,文件名,流等必须从这里移动到那里,这变得很麻烦。在这种情况下,它不像MainForm有一些关于UserControl无法处理的打印机的特殊能力。