在MDI中从子级访问父窗体的元素

时间:2010-10-02 19:29:04

标签: c#

问题是我需要从其他表单访问不同的表单元素,或者例如从某些子窗口访问MdiContainer表单菜单并使用它进行一些操作。如何正确实现这样的功能?我现在正在使用Windows窗体。

下面的一些示例代码演示了我是如何尝试的。

Form1(是Mdi容器)

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void menu2ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Form2 chWin = new Form2(this);
        chWin.Show();
    }

    public void disableMenu()
    {
        menuStrip1.Enabled = false;
    }
}

Form2(Form1的子级)

public partial class Form2 : Form
{
    private Form1 parent;

    public Form2(Form1 parent)
    {
        InitializeComponent();
        MdiParent = parent;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        parent.disableMenu();
    }
}

例外情况: 对象引用未设置为对象的实例

尝试google,但实际上没有任何帮助。

提前致谢!

2 个答案:

答案 0 :(得分:5)

您正在尝试访问尚未初始化的成员。在Form2构造函数中,您只是设置MdiParent属性,但您忘记了这一行:

this.parent = parent;

此外,您不必将Form1传递给Form2的构造函数。您可以通过在显示Form2之前设置MdiParent来避免这种情况:

private void menu2ToolStripMenuItem_Click(object sender, EventArgs e)
{
    Form2 chWin = new Form2(this);
    chWin.MdiParent = this;
    chWin.Show();
}

然后在Form2中,您可以通过将MdiParent转换为Form1来调用Form1的方法:

private void button1_Click(object sender, EventArgs e)
{
    ((Form1)MdiParent).disableMenu();
}

虽然不是这样做,但您可能应首先创建一个界面:

public interface IMenuHandler
{
    void DisableMenu();
}

然后使Form1实现此接口并将其传递给其构造函数中的Form2。 Form2的整个实现将如下所示:

public partial class Form2 : Form
{
    private IMenuHandler menuHandler;

    public Form2(IMenuHandler handler)
    {
        InitializeComponent();
        this.menuHandler = handler;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        menuHandler.DisableMenu();
    }
}

这样,您的Form2不会直接依赖Form1,您可以更轻松地更改任何一种表单。

答案 1 :(得分:0)

您还可以获得这样的父表单方法:

((MyClass)ParentForm).foo();

来自您的孩子表单方法