如何从子窗体访问父窗体控件

3
我是一名有用的助手,可以为您翻译文本。
我正在使用Windows窗体应用程序,已经尝试了所有我所知道的方法,但无法访问父窗体中子窗体控件。 到目前为止我尝试的代码:
this.ParentForm.Controls["PanelContainer"].Visible = false;

并且

this.MdiParent.Controls["pnlContainer"].Visible = false;

并且

Form myform = btnLogin.FindForm();
myform.Parent.Controls["PanelContainer"].Visible = false;

我尝试为面板控件设置公共属性:
public Panel PanelContainer
{
    set { pnlContainer = value; }
    get { return pnlContainer; }
}

但是我一直遇到一个异常:“对象引用未设置为对象的实例”。 编辑1:这是我的表单快照:

enter image description here

编辑2:这是我在ContainerPanel中添加表单的方式

var login = new Login();
login.TopLevel = false;
login.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
PanelContainer.Controls.Add(login);
login.Show();

可能是什么是NullReferenceException,如何修复它?的重复问题。 - adv12
也许不是一个Mdi窗体,我在Load事件中创建了一个Form对象,并将控件添加到容器面板中。属性值为TopLevel=falseFormBorderStyle为none。@LarsTech - Jamshaid K.
解决问题的方式会有很大的不同。请展示您的表单加载代码。 - LarsTech
请检查Edit2部分。@LarsTech - Jamshaid K.
1
你在谈论我们看不到的东西。你必须展示更多的代码,才能让任何人帮助你。 - LarsTech
显示剩余10条评论
3个回答

1

如果我理解正确的话,我遇到了同样的问题。我被“ParentForm”这个术语所困惑,而这个答案确实帮助我解释了为什么我做错了。

Parentform和Owner有什么区别?

为了允许顶层窗体与低级窗体共享控件:

1.) 在窗体设计器中打开主窗体,选择要共享的控件,并将其修改器设置为“Internal”。

2.) 调用低级窗体时,将“this”作为Show()方法的owner参数。

LoginForm login = new LoginForm();
login.Show(this);

3.) 从较低级别的表单中,现在可以引用Owner属性并将其强制转换回其类类型,以按名称访问共享控件。

((MainForm)Owner).PanelContainer.Visible = false;

仅供参考:在低级表单的构造函数中,对((MainForm)Owner)的引用将无法工作,因为它尚未从主窗体中显示。您可以在Load事件中执行((MainForm)Owner).PanelContainer.Visible = false;行。 - John Kurtz

0

Controls对象是Control的一个可通过索引访问的集合。

this.ParentForm.Controls[0].Visible. . .

你所引用的名称通常应该嵌套在某个类似于以下内容的结构中:

this.ParentForm.Controls[0].Name

父表单为空,我不知道为什么它为空。 - Jamshaid K.
您正在尝试访问“登录”控件的ParentForm吗? - pay
是的,我想从子窗体访问父窗体中的控件。 - Jamshaid K.
再次调试其中一行代码,并将鼠标悬停在“this”上。很可能当您指向“this”时,实际上是指向您的主窗口控件。如果您查看“this.Children”,您很可能会看到您的登录表单。 - pay
是的,这个关键字指的是登录表单,但是登录表单的父属性为空。 - Jamshaid K.
显示剩余2条评论

0

确保父窗体中的控件设置为公共。之后,访问该控件就像简单的操作一样。

ParentForm frmParentForm= (ParentForm)Application.OpenForms["ParentForm"];
frmParentForm.YourControlName

实际上,我可以获取父窗体,但每当我将子窗体添加到父窗体面板时,它会删除父引用。 - Jamshaid K.

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