在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中的强大编码器,但我确实认识到从设计角度来看,事件/消息传递方法可能“更好”。
现在,这是我的问题。
我有一个主要表单,为了命名:ParentForm。 ParentForm目前使用后一种形式(har har!)的消息传递来传递数据,比如FirstChildForm。基本上,一旦ParentForm获取数据,它就会触发DataReadEventHandler,数据从ParentForm传递给FirstChildForm。
没问题。
现在,我/还有一个从ParentForm派生的表单,名为SecondChildForm。注意:这不是ChildForm的另一个实例......它是一种完全不同的形式。这是捕获 - 当SecondChildForm上的数据更新时,我希望将此数据传递给FirstChildForm。这似乎是一个简单的想法,虽然我在如何实现它时遇到了一些困难。我能想到的是从ParentForm为每个子设置独特的事件处理程序,并使用SecondChildFrom的事件处理程序然后触发ParentForm的FirstChildForm的事件处理程序...这听起来非常复杂,因为数据(非平凡的大小,我必须首先从SecondChildForm传递给ParentForm,然后从ParentForm传递给FirstChildForm。
有更好的方法吗?
另外,我真的不想这么说,但是,老实说,在这个高度封闭的应用程序中,如果正确的方法是高度复杂的,我可以打破简单范式(但仍会分配时间)适当重构的未来 - 是的,我实际上/我/能够做到这一点!)。
干杯!
-Kadaj
答案 0 :(得分:3)
因此,数据首先在第二个子项上生成,因此在该表单上,我们需要一个可以触发的事件来提供该数据:
public class SecondChildForm : Form
{
public event Action<MyData> 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
}
}
瞧。
请注意,使用此模式,每个孩子都不知道他们的父母。它们通过事件公开父母所需的信息,并且它们允许父母通过公共方法影响它,但是他们不知道或不关心哪个类正在使用它们。父 知道它的子类型;它适合于拥有特定子类型的实例并直接操纵它的公共成员(但不是它的内部控件,不应该是公共的)。