gpt4 book ai didi

c# - 从 MDI 中的子项访问父窗体的元素

转载 作者:太空宇宙 更新时间:2023-11-03 19:33:01 25 4
gpt4 key购买 nike

问题是我需要从其他表单访问不同的表单元素,或者例如从某些子窗口访问 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();
}
}

异常(exception)情况:对象引用未设置到对象的实例

试图用谷歌搜索它,但实际上对我的场合没有任何帮助。

提前致谢!

最佳答案

您正在尝试访问尚未初始化的成员。在 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();
}

虽然您可能应该先创建一个接口(interface)而不是这样做:

public interface IMenuHandler
{
void DisableMenu();
}

然后让Form1实现这个接口(interface),并在其构造函数中将其传递给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,并且您可以更轻松地更改其中任何一个表单。

关于c# - 从 MDI 中的子项访问父窗体的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3847200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com