0

これについての manu 記事を読みましたが、まだ混乱しています。

Form1 から Form2 を開きます。

new Form2().Show();

Form2.ClosingEvent で必要なもの:

Form1.TextBox1.Visible = false;

これを達成するには、どのコードと正確にどこに配置する必要がありますか?

4

3 に答える 3

8

問題は、コードが現在構造化されている方法では、Form2クラスのインスタンスがクラスのインスタンスについて何も知らないということForm1です。したがって、他のオブジェクトのプロパティにアクセスしたり、メソッドを呼び出したりすることはできません。Form1とは、オブジェクトではなく、クラスForm2の名前であることを忘れないでください。

ハッキーな解決策は、オブジェクトForm2への参照を保持するパブリックフィールドをクラスに追加することです。クラスのインスタンスを作成した後、メソッドを呼び出す前にForm1、そのフィールドに入力します。Form2Show

次に遭遇する問題は、デフォルトでは、フォームのコントロールが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#でのオブジェクト指向プログラミングに関する本を読むことを強くお勧めします。このようなデザインは、間違えた場合に後で修正するのは困難です。

于 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 に答える