我阅读了有关此的手册文章,但是-仍然感到困惑。
从 Form1 我打开 Form2:
new Form2().Show();
在 Form2.ClosingEvent 我需要:
Form1.TextBox1.Visible = false;
我应该把什么代码和确切地放在哪里 - 来实现这一点?
问题在于,按照您的代码当前的结构方式,您的类实例Form2
对您的类实例一无所知Form1
。因此,它不能访问其他对象的属性或调用方法。请记住,Form1
andForm2
是类的名称,而不是对象的名称。
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;
然而,模态的缺点是用户无法Form1
在Form2
打开时进行交互。从你的问题中不清楚这是否可行。如果没有,我推荐之前的解决方案,它涉及引发事件。无论哪种方式,我都强烈建议您阅读一本关于 C# 面向对象编程的书。如果你弄错了,这样的设计以后很难修复。
您可以使用,好吧,访问您的父表单ParentForm
。
在这种情况下((Form1)ParentForm).TextBox1.Visible = false;
,假设TextBox1
是从外部可见的。
在 Form2.ClosingEvent 上
Form1 parentForm = Application.OpenForms["FormName"] as Form1;
if (parentForm != null)
{
parentForm.TextBox1.Visible = false;
}
确保在 form1 TextBox1 上是公开的