これについての manu 記事を読みましたが、まだ混乱しています。
Form1 から Form2 を開きます。
new Form2().Show();
Form2.ClosingEvent で必要なもの:
Form1.TextBox1.Visible = false;
これを達成するには、どのコードと正確にどこに配置する必要がありますか?
問題は、コードが現在構造化されている方法では、Form2
クラスのインスタンスがクラスのインスタンスについて何も知らないということForm1
です。したがって、他のオブジェクトのプロパティにアクセスしたり、メソッドを呼び出したりすることはできません。Form1
とは、オブジェクトではなく、クラスForm2
の名前であることを忘れないでください。
ハッキーな解決策は、オブジェクト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が公開されていることを確認してください