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

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

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

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

Q&A

解決済

2回答

6064閲覧

c#:2つのUserControl間でデータをやり取りしたい

dodome_iro

総合スコア14

C#

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

0グッド

0クリップ

投稿2019/01/07 11:04

編集2019/01/07 11:11

c#で2つのUserControl間でデータをやり取りしたいのですがうまくいきません。
具体的にはUserControl3でテキストボックスにデータを入力した後、UserControl3のボタンを押すとUserControl4が表示されUserControl3は非表示にします。この時にUserControl3で入力したデータをUserControl4のラベルに表示させたいのです。

試してみたこと:
以下のようなプログラムを試してみましたがラベルには何も表示されていません。
一応,下図のように初期値としてlabel2とlabel3があるのですがそれが消えてしまうということは。実際に代入されているのが空の文字列になっているのだと思います。

c#

1//Form1.cs(一部) 2ctr1 = new UserControl1(); 3ctr2 = new UserControl2(); 4ctr3 = new UserControl3(); 5ctr4 = new UserControl4();

c#

1//UserControl3.cs(一部) 2private void button1_Click(object sender, EventArgs e) 3 { 4 Form1.ctr4.Visible = true; 5 Form1.ctr3.Visible = false; 6 Form1.ctr4.label2.Text = textBox1.Text; 7 Form1.ctr4.label3.Text = textBox2.Text; 8 }

UerControl4.cs(デザイン)
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、各ユーザーコントロールが他のユーザーコントロールにアクセスする設計がよろしくないかと思います。
各コントロールは何かして欲しいタイミングでイベントを起こし、そのユーザーコントロールが使用されているフォームにてイベントを受け取り、他のコントロールへアクションを起こすという形がいいのではないかと思います。

usercontrol3

C#

1public event EventHandler OKClick; 2public string InputString1 3{ 4 get 5 { 6 return textBox1.Text; 7 } 8} 9public string InputString2 10{ 11 get 12 { 13 return textBox2.Text; 14 } 15} 16 17private void button1_Click(object sender, EventArgs e) 18{ 19 if (OKClick != null) 20 { 21 OKClick(this, e); 22 } 23}

usercontrol4

C#

1public string Message1 2{ 3 set 4 { 5 label2.Text = value; 6 } 7} 8public string Message2 9{ 10 set 11 { 12 label3.Text = value; 13 } 14}

Form1

C#

1private void usercontrol3_OKClick(object sender, EventArgs e) 2{ 3 ctr3.Visible = false; 4 ctr4.Visible = true; 5 ctr4.Message1 = ctr3.InputString1; 6 ctr4.Message2 = ctr3.InputString2; 7 8}

みたいな感じで

投稿2019/01/07 11:41

YAmaGNZ

総合スコア10242

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

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

dodome_iro

2019/01/07 15:38 編集

ご回答ありがとうございます。しかし、全くの初心者なものでうまくいきません。差し支えなければもう少しお付き合い願いませんか?m(-_-)m うまくいかない具体的内容としては、前回教えていただいた修正を加えたのですがUserControl4に遷移しなくなりました。調べてみたところOKCick == null となっているようでOKClick(this, e);が機能していません。また、button1_Click自身が機能していることは確認済みです。 PS.あまりにも初歩的なことで躓きすぎているので無視していただいても一向にかまいません
YAmaGNZ

2019/01/07 22:05

UserControl3のイベントのイベントハンドラを登録していないのでしょう。 FormのLoadイベント時などに ctr3.OKClick += new EventHandler(usercontrol3_OKClick); という感じでイベントハンドラの追加を行ってください。
guest

0

現在起きている問題については今掲載されているソースからは判断できない気がします。
とりあえずそれはどうでもいいです(え?いいの?)。

ともかく「ある UserControl に同 Form 上にある別の UserControl を操作するイベントを直接実装する」というやり方は一般的なセオリーから外れた実装のように思います。
(そんな密結合なものを個別の UserControl として実装する意味はなんでしょうか?)
私には未来のソースコードに私には見えます。人類にはちょっと早すぎる可能性があります(言い過ぎー!)。

一般的には Form 内の要素間の作用は Form の実装として解決するでしょう。
やり方はいくつかありますが一例を挙げるならサンプルの button1_Click のイベントは UserControl ではなく Form に書くというのが一般的なように思います。
そうすると自然と問題も解決しやすくなるような気がします(たぶん)。

投稿2019/01/07 11:43

toydev

総合スコア297

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

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

toydev

2019/01/07 11:50 編集

これ書いている間に既にほかの回答がついてましたねー。YAmaGNZ さんと言っていることは一緒です!やっぱりそう感じますよね。よかった(ホッ)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問