【问题标题】:Accessing Main Form From Child Form从子窗体访问主窗体
【发布时间】:2011-07-23 13:41:01
【问题描述】:

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

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

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

这可能吗??

【问题讨论】:

  • 您是否尝试实现一个包含Saveapply 按钮的对话框?

标签: c# winforms parent-child


【解决方案1】:

场景 1:在子窗体中单击按钮时调用父窗体中的方法。

在子窗体中创建一个Event。在某些按钮单击等上引发该事件。在父表单中订阅该事件并在其中调用父表单方法。

场景二:子窗体关闭时调用父窗体中的方法。

处理父窗体中子窗体的FormClosedFormClosing 事件,并在其中调用父窗体的方法。

ChildForm frm = new ChildForm();
frm.FormClosed += new FormClosedEventHandler(frm_FormClosed);

void frm_FormClosed(object sender, FormClosedEventArgs e)
    {
        //Call your method here.
    }

【讨论】:

    【解决方案2】:

    有很多方法可以实现这一点,但这里有一个简单的方法。在您的主窗体中,当您创建并显示一个子窗体时,请这样做:

    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); - 无论哪种方式,代码都可以正常工作。
    • 我用过 ShowDialog(this);但我在 ChildForm 中得到 this.Owner 的 null 值。
    • MainForm 父级 = (MainForm)this.ParentForm; parent.CallCustomMethod();
    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多