我在这篇文章中引用了manu文章,但是 - 仍然感到困惑。
从Form1我打开Form2:
new Form2().Show();
在Form2.ClosingEvent上我需要:
Form1.TextBox1.Visible = false;
我应该用什么代码和确切的位置来实现这一目标?
答案 0 :(得分: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;
然而,模态的缺点是,当Form1
打开时,用户无法与Form2
进行互动。从您的问题中不清楚这是否可行。如果没有,我推荐以前的解决方案,其中涉及举办活动。不管怎样,我强烈建议您在C#中学习一本关于面向对象编程的书。如果你弄错的话,这样的设计很难在以后解决。
答案 1 :(得分:6)
您可以使用ParentForm
。
在这种情况下((Form1)ParentForm).TextBox1.Visible = false;
,假设从外部可以看到TextBox1
。
答案 2 :(得分:2)
在Form2.ClosingEvent
上Form1 parentForm = Application.OpenForms["FormName"] as Form1;
if (parentForm != null)
{
parentForm.TextBox1.Visible = false;
}
确保在form1上TextBox1是公共的