フォーム1から生成されたフォーム2画面で、フォーム1のラベルの変更とフォーム1のボタンのクリックを行えるようにする

このサンプルは、フォーム間のアクセスの様子をアクションを絞って実験してものです
VisualStudioの基本的な操作とC#クラス、インスタンスの仕組みを理解している前提となっています
なので、詳細なチュートリアルとはなっていません

ソリューション構成

Form1

デザイン

コード

namespace CreateSecondForm
{
    public partial class Form1 : Form
    {
        Form form2;
        public Form1()
        {
            InitializeComponent();

            form2 = new Form2(this);
            form2.Show();
        }

        internal Label GetLabel()
        {
            return label1;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            button1.Text = "押された";
        }
    }
}

このコードは、Visual StudioのC#でWindowsフォームアプリケーションを開発する際のサンプルコードの一部です。以下は各行の説明です。

1行目から始まる namespace CreateSecondForm は、このファイルのコードが含まれる名前空間を示しています。名前空間は、クラスや関数などのコード要素のグループ化に使われます。

3行目の public partial class Form1 : Form は、Form1 クラスの宣言を行っています。このクラスは、Form クラスを継承しています。Form クラスは、Windowsフォームアプリケーションの基本的な機能を提供するクラスです。

4行目の Form form2; は、Form2 クラスのインスタンスを保持するための変数 form2 を宣言しています。

6行目から始まる public Form1() は、Form1 クラスのコンストラクタを定義しています。コンストラクタは、クラスがインスタンス化された際に実行されるメソッドで、この場合は Form1 クラスのオブジェクトが作成された際に実行されます。

7行目の InitializeComponent() は、Visual Studioが自動的に生成するコードで、Windowsフォームアプリケーションの初期化に必要なコントロールやイベントの登録を行います。

9行目の form2 = new Form2(this); は、Form2 クラスのインスタンスを作成し、変数 form2 に代入しています。また、this を引数として渡しています。これは、Form1 クラスのインスタンスを Form2 クラスに渡していることを意味します。

11行目の form2.Show(); は、Form2 クラスのオブジェクトを表示するためのメソッドです。

13行目の internal Label GetLabel() は、Label コントロールを返すメソッドを定義しています。internal キーワードは、同じアセンブリ内からのみアクセス可能であることを示しています。

16行目の private void button1_Click(object sender, EventArgs e) は、ボタンがクリックされた時に実行されるメソッドです。このメソッドでは、ボタンのテキストを変更する処理が実装されています。object senderEventArgs e は、イベントハンドラーに渡される引数です。

Form2

デザイン

コード

namespace CreateSecondForm
{
    public partial class Form2 : Form
    {
        Form1 form1;

        public Form2(Form1 form1)
        {
            this.form1 = form1;
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            (form1.Controls["label1"]as Label).Text = "フォーム2でボタンをクリックされた";
            // form1.GetLabel().Text = "フォーム2でボタンをクリックされた";

            (form1.Controls["button1"] as Button).PerformClick();
        }
    }
}

// フォーム1にあるLabel1のテキストを変更する
//Label label = form1.Controls.Find("label1", true).FirstOrDefault() as Label;

//if (label != null)
//{
//    label.Text = "フォーム2でボタンをクリックされた";
//}

このコードは、2つのフォームを作成し、ボタンをクリックしたときにフォーム1のラベルのテキストを変更するためのものです。Form2クラスは、Formクラスを継承し、フォーム1のインスタンスを受け取ります。ボタンがクリックされると、Form1のラベルのテキストを変更し、Form1のボタンのクリックイベントを呼び出します。コメントアウトされたコードは、同じ目的で、Findメソッドを使用してラベルを探し、テキストを変更する方法を示しています。

他のフォームのボタンを押せる機能

(form1.Controls["button1"] as Button).PerformClick();

このコードは、Windowsフォームアプリケーションにおいて、Form1とForm2という2つのフォームがある場合に、Form2内で実行されるものです。Form2からForm1のコントロールである「button1」のクリックイベントを発生させるために使用されます。

form1.Controls["button1"]は、Form1上にある「button1」という名前のボタンのコントロールを取得するために使用されます。取得されたオブジェクトは、as Buttonを使ってButton型にキャストされ、Buttonオブジェクトに変換されます。その後、PerformClick()メソッドを使用して、Buttonオブジェクトのクリックイベントをプログラム的に発生させ、Form1の「button1」ボタンのクリックイベントを実行します。 これにより、Form2からForm1のイベントをトリガーすることができます。