问题是我需要从其他表单访问不同的表单元素,或者例如从某些子窗口访问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,但实际上没有任何帮助。
提前致谢!
答案 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();
来自您的孩子表单方法