2014-07-01 157 views
0

我的窗体中有一个菜单栏和下面的空间来显示我的控件。我的菜单栏中的其中一个按钮是打印按钮,打印当前位于用户控件I中的图形。如果图形是打印按钮的事件处理程序的窗体上我可能只是简单地调用WinForms中的父窗体和子窗体用户控件通信

graph.printing.print(true) 

它是不会在我的情况下工作,因为图是在控制,而不是形式。

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

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

我认为this answer已经接近我正在寻找的东西,但我认为它引导我使用面板代替用户控制。

输入后我发现最接近我的问题的答案可能是this,但该问题有孩子抚养事件和家长回应,而我有父母提高事件,父母必须从孩子获得信息。

+0

无论从UC形式的需求应通过属性或方法提供。当用户点击打印时,表单从控件获取并打印**或**,因为它显然是由usercontrol管理的数据,只需在表单调用的UC上展示PrintGraph方法 – Plutonix

+0

然后如果您有另一个UC也有一张可以打印的图表,您只需使用相同的方法或属性即可实现该功能。对? – Luminous

+0

是的 - 您有这些用户控制的原因:(理论上)它们是作为管理和显示foobar的专家而构建的。打印只是其中一项相关操作。卸载到表单可以工作,但可以是很多东西来回传打印/处理/保存/上载的东西。由于表单是主机菜单,他的角色可以少得多该命令并将其传递给相关的演员。只是因为表单确实有菜单,所以它不适合打印。 – Plutonix

回答

0

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

另一方面,表单并不是特殊的,只是因为它碰巧接收到用户打印的命令。它在这个角色可能仅仅是知道联系哪个用户控件和调用的方法:像ClearNewGraphSave和其他任何有几分相同的方式

Sub PrintGraphMenuClick.... 

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

     Case operation.Bar 
      ucBar.PrintGraph 

其他菜单选项。这里的表单角色可能是接收来自用户的命令,并将其传递给正确的控件,调用正确的正确方法并传递正确的参数 - 这不是一项简单的任务。

当然,用户控件可以替代地实现ContextMenu,而不是直接接收这些命令,而不是MainMenu

很多时候将操作卸载到别的东西上会导致如此多的属性,文件名,流等不得不从这里移动到那里变得很繁琐。在这种情况下,它不像MainForm对于UserControl无法处理的打印机有一些特殊的功能。

+0

感谢您的评论!我知道现在该做什么。我也会记住这个ContextMenu的想法。尽管如此,他并不热衷于双重否定。 – Luminous

+0

原本是为了强调,但也有点匆忙。祝你好运 – Plutonix

0

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

1)添加一个事件到你的用户控件。

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

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

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

+0

这是我希望更新状态栏的完美解决方案。谢谢。可悲的是,我的问题是问你如何让表单交谈,并让“东西”脱离控制,并松散耦合,因为我要有多个控件。 – Luminous

+0

请详细说明“talk to”和“stuff” – doker

+0

(所有这些都可以在我的问题btws中找到)在我的表单中我有一个菜单栏。其中一个菜单项是打印,即打印在表单内的控件中找到的图形。我如何将图形从控件传递到要打印的表单? – Luminous

相关问题