質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

30466閲覧

別クラスのメソッドからフォームのコントロールを操作したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2018/10/19 06:50

C# visual studio 2017で別クラスのメソッドからフォームのコントロールを操作するプログラムを作りたいと考えています。

①別クラスから操作したいコントロールをPublicにする
②フォーム部分で別クラスのメソッドを呼び出す
③呼び出されたクラスのメソッド内でフォームのインスタンスを生成し処理を実行する

これでは呼び出されたクラス内でフォームを新しく生成してしまっているので実際に変更したいフォームの値を操作していない。
ということまではわかりました。

少し調べたところ、以下のようなサンプルコードを見つけました。

C#

1[作成クラスのコード] 2 3public class MyClass 4{ 5//============ 6// Form1を示すメンバー変数 7public Form1 Form1Obj; 8 9//============ 10// コンストラクタ 11public MyClass( 12Form1 Form1_Obj) 13{ 14Form1Obj = Form1_Obj; 15} 16 17//============ 18// 初期化メソッド 19public void InitializeData() 20{ 21Form1Obj.textBox1.Text = "hoge"; 22Form1Obj.textBox2.Text = "hoge2"; 23} 24}

C#

1[Form1クラスのコード] 2 3public partial class Form1 : Form 4{ 5public Form1() 6{ 7InitializeComponent(); 8} 9 10private void Form1_Load(object sender, EventArgs e) 11{ 12MyClass MyClassObj = new MyClass(this); 13MyClassObj.InitializeData(); 14} 15}

作成クラスのコードについてはなぜこのように書くのかが全く分かりません。
Form1を示すメンバー変数とありますが、ここはForm1_Objという変数を宣言しています?
コンストラクタとうい部分は何が何だかさっぱりです。

Form1クラスのコードについてはクラスのインスタンスを生成するときに引数に自分自身を渡していますが、なぜそうなるかが分かりません。

これを参考にプログラムを書くと確かに実現したい動きにはなるのですが、なぜ動くのかが分からず質問させていただきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まず、Form1を示すメンバー変数という部分は、ご理解いただいている通りForm1Objという名前の変数を宣言しているものと考えて差し支えないと思います。C#ではこういったものを"メンバ変数"もしくは"フィールド"とも呼びます。

コンストラクタでは、引数として渡されたForm1型の変数を自分(MyClass)のメンバ変数に格納しています。こうすることで、MyClass内からForm1に対する操作ができるようにしているのだと思います。Form1は参照型なので、メンバ変数に格納されるのは渡されたForm1_Objに対する参照のみです。したがって、MyClass内でForm1Objに対して行った変更は、呼び出し元のForm1クラスにも反映されます。この辺りのことは、「参照型」と「プリミティブ型」のキーワードで調べていただくと理解が深まると思います。

Form1MyClassのインスタンスを生成する際に自分自身を渡しているのは、上記の通りでMyClassインスタンスに対して自分の参照を渡すことで、MyClass内から自分(Form1)を操作できるようにするためです。

長くなりましたが少しでもご理解の助けとなれば幸いです。よろしくお願いします。

投稿2018/10/19 07:21

shun_kuwa

総合スコア187

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/19 07:28

ご回答ありがとうございます。 参照型、プリミティブ型 勉強します。ありがとうございます。 引数で自分自身のインスタンスを渡せるとういのはとても勉強になりました。 また、それによってコンストラクタ内の処理の意味もわかりました。 ありがとうございます。
guest

0

ベストアンサー

フォームを操作するためには、そのフォームのインスタンス(アドレス)があれば操作できます。

MyClass ではクラスのコンストラクタの引数として、操作するフォームのインスタンスを渡してます
以後、MyClass内で、そのインスタンスを通してフォームを操作することができます

投稿2018/10/19 07:09

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/19 07:13

ご回答ありがとうございます。 コンストラクタの引数にインスタンスを渡しているのが分かったらすべて理解できました。 ありがとうございました。大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問