c#winforms - 如何从子表单访问父表单

时间:2012-05-25 09:30:14

标签: c# winforms forms

我在这篇文章中引用了manu文章,但是 - 仍然感到困惑。

从Form1我打开Form2:

new Form2().Show();

在Form2.ClosingEvent上我需要:

Form1.TextBox1.Visible = false;

我应该用什么代码和确切的位置来实现这一目标?

3 个答案:

答案 0 :(得分:8)

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

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是公共的