前提・実現したいこと
C#でWindows上で動作するツールのプロト版を作成しようとしています。
メインフォームと複数のユーザコントロールを用いたツールで、
メインフォームに共通的なボタンを実装し、その結果を出力するための画面がユーザコントロールになります。
とっかかりとして、メインフォームのボタンクリックでユーザコントロールのテキストに文字列を表示させようとしていますが、テキストが表示されません。
ユーザコントロール上にテキストを表示させるメソッドはコールされていることを確認しており、Step実行することで、テキストボックスへ値が代入されていることも確認できています。
同様のボタンをユーザコントロール側に実装すると、期待通りテキストが表示されます。
発生している問題・エラーメッセージ
メインフォームのボタンクリックでユーザコントロールのテキストに文字列を表示させることができない。エラーの発生はなし。期待するメソッドも全てコールされている。
該当のソースコード
実際のツールのキャプチャを記載します。
Formのテキストは更新されますが、ユーザコントロール上のテキストは更新されません。(testcメソッドはコールされている)
C#
1//■メインフォーム 2 public partial class Form1 : Form 3 { 4 //private static UserControl1 _uc1; 5 6 public Form1() 7 { 8 InitializeComponent(); 9 } 10 11 public void button1_Click(object sender, EventArgs e) 12 { 13 //UserControl1.Instance.Show(); 14 15 textBox1.Text = "abc"; 16 UserControl1.Instance.testc(); 17 18 } 19 } 20 21//■ユーザコントロール 22 public partial class UserControl1 : UserControl 23 { 24 private static UserControl1 _uc1; 25 26 public UserControl1() 27 { 28 InitializeComponent(); 29 } 30 31 32 //ただ一つのフォームにアクセスするためのプロパティ 33 public static UserControl1 Instance 34 { 35 get 36 { 37 //_instanceがnullまたは破棄されているときは、 38 //新しくインスタンスを作成する 39 if (_uc1 == null || _uc1.IsDisposed) 40 { 41 _uc1 = new UserControl1(); 42 } 43 return _uc1; 44 } 45 } 46 47 48//メインフォームからこの関数を呼んでも、テキストが更新されない 49 50 public void testc() 51 { 52 textBox1.Text = "cde"; 53 } 54 55//ユーザコントロール(自分)からこの関数を呼べば、テキストが更新される。 56 public void button1_Click(object sender, EventArgs e) 57 { 58 textBox1.Text = "def"; 59 } 60 61 62 } 63 64 65### 試したこと 66 67同様のボタンをユーザコントロール側に実装すると、期待通りテキストが表示されます。 68 69### 補足情報(FW/ツールのバージョンなど) 70 71ここにより詳細な情報を記載してください。
コンパイルエラーにならないのが不思議です。textBox1 が見えないからでしょう。コンパイルできて回答者の手元で再現できる最小のコードを新しく作成して掲載すれば解決すると思います。
すみません、初の投稿でスレッドの編集方法がわからず、時間がかかってしまいました。コードを更新しました。
なぜシングルトンなのかわかりませんが、デザイナで作った時点では _uc1 が null だからですね。YamGNZ さんの意見の通り、シングルトンを使うのをやめればいいと思います。どうしてもこれで行くならコンストラクタで _uc1 に this を入れることでうまくいきそうではありますが、冗長かつ他のバグが入りそうという点でお勧めしません。
ありがとうございます!試してみます!
無事解決しました!ありがとうございました!
回答1件
あなたの回答
tips
プレビュー