在3个单独的WinForms之间传递数据

在C#WinForms领域的整个编码过程中,我遇到过许多实例,在这些实例中我遇到了在表单之间传递数据的不同方法。 我在一个大型代码库上工作 – 其中一些方法是由其他人编写的,我后来扩展了,其他的都是我自己编写的。 似乎有两个主要的范例,我编写的这两个范例相当舒服。

1.)在实例化或显示子表单时,将父表单传递给子表单。 例如:

ChildForm.Instance = new ChildForm(this); --Or-- ChildForm.Instance = new ChildForm(); ChildForm.Instance.Show(this.TopLevelControl); 

这允许孩子从父母那里提取信息,并允许父母调用孩子的方法。 忍受我一会儿 – 我确实意识到这打破了这么多范例,并且是“糟糕”的做法 – 记住,我在维护更大的代码库时遇到了大部分问题,我需要对其进行增量调整没有做完整的重构。

2.)使用事件委托允许在父表单和子表单之间传输数据。 据我所知,这仍然需要父表单在产生孩子时建立此事件。 例如:

在父母内:

  childForm = new ChildForm(this); DataRead += new DataReadEventHandler(childForm.ChildForm_DataRead); 

在孩子内:

  public void ChildForm_DataRead(Data data) { if (InvokeRequired) { Invoke(new MethodInvoker(delegate() { ChildForm_DataRead(data); })); } else //do something } 

这种性质的东西。 现在,我仍然不是C#WinForms中的强大编码器,但我确实认识到从设计角度来看,事件/消息传递方法可能“更好”。


现在,这是我的问题。

为了命名,我有一个主要forms:ParentForm。 ParentForm目前使用后一种forms(har har!)的消息传递来传递数据,比如FirstChildForm。 基本上,一旦ParentForm获取数据,它就会触发DataReadEventHandler,并将数据从ParentForm传递给FirstChildForm。

没问题。

现在,我/还有一个从ParentForm派生的表单,名为SecondChildForm。 注意:这不是ChildForm的另一个实例……它是一种完全不同的forms。 这是捕获 – 当SecondChildForm上的数据更新时,我希望将此数据传递给FirstChildForm。 这似乎是一个简单的想法,虽然我在如何实现它的过程中遇到了一些困难。 我能想到的是从ParentForm为每个子节点设置独特的事件处理程序,然后让SecondChildFrom的事件处理程序触发ParentForm的FirstChildForm的事件处理程序…这听起来非常复杂,因为数据(非平凡的大小,我必须首先从SecondChildForm传递给ParentForm,然后从ParentForm传递给FirstChildForm。

有更好的方法吗?

另外,我真的不想这么说,但是,老实说,在这个高度封闭的应用程序中,如果正确的方法是高度复杂的,我可以打破简单的范例(不过在未来会分配时间)适当的重构 – 是的,我实际上/我/能够做到这一点!)。

干杯!

-Kadaj

因此,数据首先在第二个子节点上生成,因此在该表单上,我们需要一个可以触发的事件来提供该数据:

 public class SecondChildForm : Form { public event Action SomethingHappened; //Other code, including code that fires the event at some point } 

然后我们有第一个子节点,它有一些需要调用的方法传入该数据:

 public class FirstChildForm : Form { public void WhenSomethingHappens(MyData data) { //Do stuff with data } } 

最后,我们有了一个主窗体,它创建了两个窗体并连接了相应的事件处理程序:

 public class ParentForm : Form { public ParentForm() { FirstChildForm firstChild = new FirstChildForm(); SecondChildForm secondChild = new SecondChildForm(); secondChild.SomethingHappened += firstChild.WhenSomethingHappens; //show forms and do other stuff } } 

瞧。

请注意,使用此模式,每个孩子都不知道他们的父母。 它们通过事件公开父母所需的信息,并允许父母通过公共方法对其进行影响,但他们不知道或不关心哪个类正在使用它们。 父母确实知道它的孩子类型; 它适合于拥有特定子类型的实例并直接操纵它的公共成员(但不是它的内部控件,不应该是公共的)。