0

我阅读了有关此的手册文章,但是-仍然感到困惑。

从 Form1 我打开 Form2:

new Form2().Show();

在 Form2.ClosingEvent 我需要:

Form1.TextBox1.Visible = false;

我应该把什么代码和确切地放在哪里 - 来实现这一点?

4

3 回答 3

8

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

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;

然而,模态的缺点是用户无法Form1Form2打开时进行交互。从你的问题中不清楚这是否可行。如果没有,我推荐之前的解决方案,它涉及引发事件。无论哪种方式,我都强烈建议您阅读一本关于 C# 面向对象编程的书。如果你弄错了,这样的设计以后很难修复。

于 2012-05-25T09:59:49.917 回答
6

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

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

于 2012-05-25T09:32:20.447 回答
2

在 Form2.ClosingEvent 上

Form1 parentForm = Application.OpenForms["FormName"] as Form1;
if (parentForm != null)
 {
    parentForm.TextBox1.Visible = false;
 }

确保在 form1 TextBox1 上是公开的

于 2012-05-25T09:43:37.117 回答