C# 如何从子窗体访问父窗体项?

C# 如何从子窗体访问父窗体项?,c#,winforms,parent-child,C#,Winforms,Parent Child,朋友们好,请帮帮我,我是C#编程新手。请帮助我,我无法整合我的项目由于以下问题。 我已经创建了一个主屏幕窗体,其中我使用了两个面板。第一个面板包含项目名称和菜单提示。在第二个面板中,我根据用户在菜单中单击的内容加载不同的面板。menustrip包含不同的元素,如主页、更新配置文件、搜索、预订和注销。默认情况下,我在主屏幕第二面板中加载主窗体。它看起来像一个网页。成功登录后,我想清除第二个面板并加载主窗体/搜索窗体。但当我尝试这样做时,它显示“在这种情况下,你无法访问panel2”。请帮帮我,我已

朋友们好,请帮帮我,我是C#编程新手。请帮助我,我无法整合我的项目由于以下问题。 我已经创建了一个主屏幕窗体,其中我使用了两个面板。第一个面板包含项目名称和菜单提示。在第二个面板中,我根据用户在菜单中单击的内容加载不同的面板。menustrip包含不同的元素,如主页、更新配置文件、搜索、预订和注销。默认情况下,我在主屏幕第二面板中加载主窗体。它看起来像一个网页。成功登录后,我想清除第二个面板并加载主窗体/搜索窗体。但当我尝试这样做时,它显示“在这种情况下,你无法访问panel2”。请帮帮我,我已经厌倦了寻找解决办法。如果这种方法不可行,请为我提供一些替代方法。提前谢谢

我使用了下面的代码…我也将mdi parent设置为true

private void homeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Home ob1 = new Home();
        ob1.TopLevel = false;
        ob1.FormBorderStyle = FormBorderStyle.None;
        pnlBody.Controls.Clear();
        pnlBody.Controls.Add(ob1);          
        ob1.Show();
    }

    private void MainScreen_Load(object sender, EventArgs e)
    {
        MainMenuStrip.Items[5].Visible = false;
        Home ob1 = new Home();
        ob1.TopLevel = false;
        ob1.FormBorderStyle = FormBorderStyle.None;
        pnlBody.Controls.Clear();
        pnlBody.Controls.Add(ob1);
        ob1.Show();
    }

只需将该控件修饰符指定给public即可。但是,这不是一个好办法。不要这样做。如果希望从表单外部执行任何特定代码,则可以创建单独的方法,然后为该方法创建委托。您可以使用
delegate.invoke
调用该方法我在上一篇文章中已经提出了这个建议。

让我们想象一下,您的主页上有这些控件:

button1
textbox1
label1
现在,单击菜单选项时,需要隐藏上面的部分或全部控件,然后显示这些控件:

button2
textbox2
picturebox1
label2
如果需要,则可以在单击事件中进行此操作,而不使用面板:

private void homeToolStripMenuItem_Click(object sender, EventArgs e)
{
button1.Visible = false;
textbox1.Visible = false;
label1.Visible = false;

button2.Visible = true;
textbox2.Visible = true;
picturebox1.Visible = true;
label2.Visible = true;

button1.Location = new Point(X, Y);
//Other controls locations...
}
其中,新点是一个类构造函数,允许您更改窗体中控件的位置(X和Y是像素坐标)

而且。。。我想就这些了

哦,你可以用一个公共整数来计算页码。。。因此,如果您有例如3个页面,当用户单击时,我不知道“第2页”,您的公共变量X的值将为2,因此在您的事件中,您可以比较页面组合:

private void homeToolStripMenuItem_Click(object sender, EventArgs e)
{
if(x==1)//You know you are un page 1, you hide all the page 1 controls
{
button1.Visible = false;
textbox1.Visible = false;
label1.Visible = false;
}

else if(x==2)
{
//Hide you page 2 control, etc.
}


//After hidding your controls, next you have to show this page controls and adjust them to the form which are this ones:
button2.Visible = true;
textbox2.Visible = true;
picturebox1.Visible = true;
label2.Visible = true;

button1.Location = new Point(X, Y);
//Other controls locations...


//Finally, set X the value of the page number so you can copy and paste te comparation os X above in your events of every page:
 X = pagenumber;
}

问之前你有没有试过这些?面板1.可见=假;面板1.SendToBack();但我希望它们是可见的。我只想在panel2中加载不同的表单,具体取决于在menustrip上的点击。@Shra1您在我的帖子中有什么问题吗?如果你在理解流程方面有问题,你可以问我。或者如果我错了,告诉我。我会尝试更正我的答案。谢谢你的回复。我试图将panel2改为public,但它仍然说“在这种情况下,您无法访问panel2”。我没有试着与代表们交流。我对C#编程还不熟悉,我不了解委托以及所有的内容。