c#winforms - 如何从ChildForm访问ParentForm

Bon*_*aca 0 c# forms winforms

我引用了manu的文章,但是 - 仍然感到困惑.

从Form1我打开Form2:

new Form2().Show();
Run Code Online (Sandbox Code Playgroud)

在Form2.ClosingEvent我需要:

Form1.TextBox1.Visible = false;
Run Code Online (Sandbox Code Playgroud)

什么代码,到底应该放在哪里 - 实现这个目标?

Cod*_*ray 8

问题在于,您的代码当前的结构方式,您的Form2类实例对您的Form1类实例一无所知.因此,它无法访问其他对象上的属性或调用方法.请记住,Form1并且Form2的名称,而不是对象.

hacky解决方案是在您的Form2类中添加一个包含Form1对象引用的公共字段.在创建Form2类的实例之后,但在调用Show方法之前,您将填写该字段.

您将遇到的下一个问题是,默认情况下,表单上的控件是private,这意味着只有定义表单的类内部的代码才能访问它们.无法从其他类中的代码访问或操作它们.

您从根本上打破了面向对象的设计.一个类不应该操纵或访问另一个类的私有成员.

如果有的话,你应该全力以赴Form1.修改Form2类以在事件关闭时引发事件,然后从中订阅该事件Form1.在Form1事件处理程序方法内部,隐藏文本框.

快速而肮脏的解决方案是切换到ShowDialog方法,该方法显示另一种形式并阻止执行,直到该表单关闭.然后你可以写:

// Create an instance of your Form2 class and show it as a modal dialog
using (var f = new Form2())
{
    f.ShowDialog(this);
}

// When the ShowDialog method returns, the Form2 form has closed, so
// you can go ahead and change the visible state of your control on Form1.
this.TextBox1.Visible = false;
Run Code Online (Sandbox Code Playgroud)

然而,模态的缺点是用户Form1Form2打开时无法与之交互.从你的问题不清楚这是否可行.如果没有,我推荐以前的解决方案,其中涉及举办活动.不管怎样,我强烈建议您在C#中学习一本关于面向对象编程的书.如果你弄错了,这样的设计很难在以后解决.


use*_*016 6

您可以使用,访问您的父表单ParentForm.

在这种情况下((Form1)ParentForm).TextBox1.Visible = false;,假设TextBox1从外部可见.