我有一个简单的问题:我在win-forms/c#中有一个主表单,它有一个绑定到数据库的列表框。
当我点击一个按钮时,会创建一个新的表单。
当我在子表单上点击一个按钮时,我想调用主表单中存在的一个方法,该方法更新列表框或者当子表单关闭时调用该函数。
这个可能吗?
我有一个简单的问题:我在win-forms/c#中有一个主表单,它有一个绑定到数据库的列表框。
当我点击一个按钮时,会创建一个新的表单。
当我在子表单上点击一个按钮时,我想调用主表单中存在的一个方法,该方法更新列表框或者当子表单关闭时调用该函数。
这个可能吗?
有很多方法可以实现这个目标,但是这里提供一种简单的方式。在您的主窗体中创建并显示子窗体时,可以按照以下方式完成:
ChildForm child = new ChildForm();
child.Show(this); // this calls the override that takes Owner parameter
那么,当你需要从子窗体调用主窗体中的方法时,请使用以下代码(假设你的主窗体类型为MainForm
):
MainForm parent = (MainForm)this.Owner;
parent.CallCustomMethod();
一种更复杂的方法是使用依赖注入的形式,在子窗体的构造函数中传递对父窗体引用(或者更准确地说,传递对父窗体接口的引用)。但上述方法简单且可能已经足够满足您的需求(实际上它本身就是一种某种程度上的依赖注入形式)。
ShowDialog(this);
- 无论哪种方式,代码都能正常工作。 - MusiGenesis场景1:在子窗体按钮单击时调用父窗体中的方法。
在子窗体中创建一个“事件”。在某些按钮单击等操作中引发该事件。在父窗体中订阅该事件并在其中调用父窗体的方法。
场景2:在关闭子窗体时调用父窗体中的方法。
在父窗体中处理子窗体的“FormClosed”或“FormClosing”事件,并在其中调用父窗体的方法。
ChildForm frm = new ChildForm();
frm.FormClosed += new FormClosedEventHandler(frm_FormClosed);
void frm_FormClosed(object sender, FormClosedEventArgs e)
{
//Call your method here.
}