从子窗体访问主窗体

6

我有一个简单的问题:我在win-forms/c#中有一个主表单,它有一个绑定到数据库的列表框。

当我点击一个按钮时,会创建一个新的表单。

当我在子表单上点击一个按钮时,我想调用主表单中存在的一个方法,该方法更新列表框或者当子表单关闭时调用该函数。

这个可能吗?


你是否正在尝试实现一个包含“保存”和“应用”按钮的对话框? - manji
2个回答

16

有很多方法可以实现这个目标,但是这里提供一种简单的方式。在您的主窗体中创建并显示子窗体时,可以按照以下方式完成:

ChildForm child = new ChildForm();
child.Show(this); // this calls the override that takes Owner parameter

那么,当你需要从子窗体调用主窗体中的方法时,请使用以下代码(假设你的主窗体类型为MainForm):

MainForm parent = (MainForm)this.Owner;
parent.CallCustomMethod();

一种更复杂的方法是使用依赖注入的形式,在子窗体的构造函数中传递对父窗体引用(或者更准确地说,传递对父窗体接口的引用)。但上述方法简单且可能已经足够满足您的需求(实际上它本身就是一种某种程度上的依赖注入形式)。


1
你也可以使用 ShowDialog(this); - 无论哪种方式,代码都能正常工作。 - MusiGenesis
我已经使用了ShowDialog(this); 但是在ChildForm中,this.Owner返回null值。 - Abi
MainForm parent = (MainForm)this.ParentForm; parent.CallCustomMethod(); 主窗体 parent = (MainForm)this.ParentForm; parent.CallCustomMethod(); - Fabián Romo

6

场景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.
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接