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

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

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

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

Q&A

解決済

1回答

25491閲覧

別のクラスを呼び出しフォームのコントロールを操作したい

tobitti

総合スコア14

C#

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

0グッド

1クリップ

投稿2017/02/13 15:18

編集2017/02/13 15:40

###前提
C#を勉強しつつアプリケーションを作っています。
###・実現したいこと
Form1にTextBoxとButtonを設置。
Read.csという新たなクラスを作りそこでバックグラウンドでテキストを読み込み、Form1のテキストボックスに表示する。
そのReadは他のフォームや他のテキストボックス(例TextBox2)でも利用したい。
Form1のButtonを押したときの処理にRead.read(textBox);のように呼び出して実行したい。

###実現に向けて
下記のソース環境で実現したいです。

C#

1//Read.cs 2class Read 3 { 4 public void read() 5 { BackgroundWorker bw = new BackgroundWorker(); 6 bw.DoWork += new DoWorkEventHandler(bw_DoWork); 7 bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(); 8 // バックグラウンド操作の実行 9 bw.RunWorkerAsync(); 10 } 11 12 private void bw_DoWork(object sender, DoWorkEventArgs e) 13 { 14 //ファイルを読み込みresultに入れる処理(省略) 15 e.Result = result;//bw_Completedで受け取らせる 16 } 17 18 private void bw_Completed(object sender, RunWorkerCompletedEventArgs e)//処理が完了した時 19 { 20 //処理が完了した時 21 textboxname.Text=e.Result;//ここで呼び出したときに指定したTextBoxに入れたい。 22 } 23 } 24 }

C#

1//Form1 2 public partial class Form1 : Form 3 { 4 private void Button_Click(object sender, EventArgs e) 5 { 6 Read Readtext = new Read(); 7 Readtext.read(TextBox);//呼び出したときにコントロールの名前を指定する。 8 } 9 }

###その他
このRead.csを他のフォームでも同じように使いまわしたいと考えています。
Form1のtextboxをpublicにしてしまえばReadから指定して変更はできると思いますがあまりpublicに頼るのはどうかと思いますし、例えばFrom2から呼び出し、そこのtextbox2に入れることはできない(=Form1に書けばいいし再利用できない)と考えました。

どのようにすればコントロール名を渡せて処理できるのでしょうか。
詳しい方からすれば簡単なのかもしれませんがまだまだ勉強中で調べてもわかりませんでした。
どうぞよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

コントロールのインスタンスを渡せばいいと思いますが。あと、このような使われ方をするのであればReadクラスは静的クラスにしたほうがいいのではないでしょうか。いちいちインスタンス生成してメソッドを呼ぶというのはなくなります。

C#

1// 呼び出し側 2// Form1のtextBox1の場合 3Reader.read(textBox1); 4 5// Form2のtextBo2の場合 6Reader.read(textBox2); 7 8public class Reader 9{ 10 public static void read(TextBox textbox) 11 { 12 BackgroundWorker bw = new BackgroundWorker(); 13 bw.DoWork += bw_DoWork; 14 bw.RunWorkerCompleted += bw_Completed; 15 // バックグラウンド操作の実行 16 bw.RunWorkerAsync(textbox); 17 } 18 19 private static void bw_DoWork(object sender, DoWorkEventArgs e) 20 { 21 var textbox = (TextBox)e.Argument; 22 //ファイルを読み込みresultに入れる処理(省略) 23 var result = "hoge"; 24 e.Result = Tuple.Create<TextBox, string>(textbox, result);//bw_Completedで受け取らせる 25 } 26 27 private static void bw_Completed(object sender, RunWorkerCompletedEventArgs e)//処理が完了した時 28 { 29 var tuple = (Tuple<TextBox, string>)e.Result; 30 var textbox = tuple.Item1; 31 var result = tuple.Item2; 32 //処理が完了した時 33 textbox.Text = result;//ここで呼び出したときに指定したTextBoxに入れたい。 34 } 35}

投稿2017/02/13 16:12

turbgraphics200

総合スコア4267

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

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

tobitti

2017/02/13 18:16

ありがとうございます。 このように渡すことができるのですね。勉強になりました。 また、Tupleというものも初めて知ることができました。 確かに静的クラスのほうが良いですね。手元のコードを修正しました。 大変参考なりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問