実現したいこと
Form2.Designer.csで表示位置やサイズを設定した、RichTextBoxをForm1でAppendTextメソッドなどで操作をしたい。
発生している問題・分からないこと
文字列をRichTextBoxにAppendTextで追加し、UI上に表示たいのですが、UI上に文字列に表示されない。
該当のソースコード
C#
1//新しく、Form1.csの中身を変えました。 2//変更はForm2からClassAになったこと、FormではなくUserControlを継承する 3//ようにしたことに因るものです。 4//void ShowForm2Modal()を削除しました。 5//Form1.cs 6using System.Diagnostics; 7using System.Windows.Forms; 8namespace NewApp 9{ 10 public partial class Form1 : Form 11 { 12 private ClassA _classA; 13 public Form1(ClassA classA) 14 { 15 _classA = classA; 16 InitializeComponent(); 17 18 B(); 19 } 20 private void B() 21 { 22 RichTextBox richTextBox = _classA.A(); 23 richTextBox.AppendText("void B"); 24 Debug.WriteLine("richTextBox:" + richTextBox); 25 } 26 27 } 28} 29 30 31 32
C#
1//新しく、Fomrs.csの中身を変えました。ファイル名は、そのままにしました。 2//Form2.cs 3using System; 4using System.Diagnostics; 5using System.Windows.Forms; 6using static System.Net.Mime.MediaTypeNames; 7 8namespace NewApp 9{ 10 public partial class ClassA : UserControl 11 public ClassA() 12 { 13 InitializeComponent(); 14 } 15 public RichTextBox A() 16 { 17 return richTextBox; 18 } 19 } 20} 21
C#
1//旧Form1.cs 2using System.Diagnostics; 3using System.Windows.Forms; 4namespace NewApp 5{ 6 public partial class Form1 : Form 7 { 8 private Form2 _form2; 9 public Form1(Form2 form2) 10 { 11 _form2 = form2; 12 InitializeComponent(); 13 14 B(); 15 } 16 private void ShowForm2Modal() 17 { 18 Form2 form2 = new Form2(); 19 form2.ShowDialog(); // Form2をモーダルダイアログとして表示 20 } 21 private void B() 22 { 23 RichTextBox richTextBox = _form2.A(); 24 richTextBox.AppendText("void B"); 25 Debug.WriteLine("richTextBox:" + richTextBox); 26 } 27 28 } 29} 30
C#
1//Fomr1Designer.cs 2namespace NewApp 3{ 4 partial class Form1 5 { 6 /// <summary> 7 /// Required designer variable. 8 /// </summary> 9 private System.ComponentModel.IContainer components = null; 10 11 /// <summary> 12 /// Clean up any resources being used. 13 /// </summary> 14 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 15 protected override void Dispose(bool disposing) 16 { 17 if (disposing && (components != null)) 18 { 19 components.Dispose(); 20 } 21 base.Dispose(disposing); 22 } 23 24 #region Windows Form Designer generated code 25 private void InitializeComponent() 26 { 27 AutoScaleDimensions = new SizeF(7F, 15F); 28 AutoScaleMode = AutoScaleMode.Font; 29 ClientSize = new Size(800, 450); 30 Name = "Form1"; 31 Text = "Form1"; 32 ResumeLayout(false); 33 } 34 35 #endregion 36 37 } 38} 39
C#
1//旧Form2.cs 2using System; 3using System.Diagnostics; 4 5namespace NewApp 6{ 7 public partial class Form2 : Form 8 { 9 public Form2() 10 { 11 InitializeComponent(); 12 13 14 15 richTextBox.AppendText("Test"); 16 17 } 18 private void Form2_Load(object sender, EventArgs e) 19 { 20 Debug.WriteLine("TEst"); 21 } 22 23 public RichTextBox A() 24 { 25 return richTextBox; 26 } 27 } 28} 29
C#
1//Form2.Designer.cs 2using System; 3using System.Windows.Forms; 4namespace NewApp 5{ 6 partial class Form2 7 { 8 private System.ComponentModel.IContainer components = null; 9 10 protected override void Dispose(bool disposing) 11 { 12 if (disposing && (components != null)) 13 { 14 components.Dispose(); 15 } 16 base.Dispose(disposing); 17 } 18 #region Windows Form Designer generated code 19 private void InitializeComponent() 20 { 21 22 // 23 // Form2 24 // 25 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 26 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 27 this.ClientSize = new System.Drawing.Size(284, 261); 28 29 this.Name = "Form2"; 30 this.Text = "Form2"; 31 this.ResumeLayout(false); 32 this.PerformLayout(); 33 34 35 this.richTextBox = new System.Windows.Forms.RichTextBox(); 36 this.TabPagerich = new System.Windows.Forms.TabPage(); 37 38 this.richTextBox.Dock = System.Windows.Forms.DockStyle.Fill; 39 this.richTextBox.Location = new System.Drawing.Point(315, 2); 40 41 this.richTextBox.Size = new System.Drawing.Size(386, 268); 42 this.richTextBox.TabIndex = 0; 43 //this.richTextBox.Text = "1tteme"; 44 45 //Tab? 46 //this.TabPagerich.Controls.Add(this.TabPagerich); 47 this.TabPagerich.Controls.Add(this.richTextBox); 48 49 50 this.TabPagerich.Location = new System.Drawing.Point(4, 22); 51 this.TabPagerich.Name = "TabPagerich"; 52 this.TabPagerich.Padding = new System.Windows.Forms.Padding(3); 53 this.TabPagerich.Size = new System.Drawing.Size(392, 274); 54 this.TabPagerich.TabIndex = 0; 55 this.TabPagerich.Text = "RichText"; 56 this.TabPagerich.UseVisualStyleBackColor = true; 57 //TabControl?? 58 this.tabControl1 = new System.Windows.Forms.TabControl(); 59 this.tabControl1.Controls.Add(this.TabPagerich); 60 this.tabControl1.Location = new System.Drawing.Point(12, 12); 61 this.tabControl1.Name = "tabControl1"; 62 this.tabControl1.SelectedIndex = 0; 63 this.tabControl1.Size = new System.Drawing.Size(400, 300); 64 this.tabControl1.TabIndex = 0; 65 66 67 this.tabControl1.ResumeLayout(false); 68 this.Controls.Add(this.tabControl1); 69 70 71 } 72 73 74 75 76 private System.Windows.Forms.RichTextBox richTextBox; 77 private System.Windows.Forms.TabPage TabPagerich; 78 private System.Windows.Forms.TabControl tabControl1; 79 #endregion 80 81 } 82 83} 84 85
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
Debug.WriteLine("richTextBox:" + richTextBox);
とすると、richTextBox:System.Windows.Forms.RichTextBox, Text: Testvoid Bというように出力され、AppednTextが働いていることが見て取れます。
補足
特になし
インスタンスについて理解が不足してらっしゃるように思います。
Form1 の B メソッドで
_form2.Show();
とするとどうなりますか?
期待した通り、UI上にTestvoid Bと表示されました!
どういった理屈なのでしょうか?
インスタンスや初期化などの概念、存在意義などが理解できていないことは分かっていたのですが、
根拠なく、
private Form2 _form2;
public Form1(Form2 form2)や
RichTextBox richTextBox = _form2.A();のような書き方で十分だと思い込んでいました。
初期化や、インスタンス関連によるものなのかとは思っていたのですが、簡単に調べる程度では、自分の問題とどう関係してくるのかが分からなかったですし、ChatGPTに聞いても、LocationやFillの問題、UIスレッドの問題、など、見当違いの回答ばかりで疲れ切っているところでした。
参考になりそうな URL を紹介します。
「WindowsFormsアプリで2つ目のフォームを操作」
https://soft-rime.com/post-10310/
基礎を学ぶなら
「C# 入門講座」
https://www.umayadia.com/CSNyumon/CSNyumonToc.htm
「C# 初級講座」
https://www.umayadia.com/CSStandard/toc.htm
ご丁寧にありがとうございます。
参考書の中に、「WindowsFormsアプリで2つ目のフォームを操作」というのがありますが、
今回の私が抱えた問題は、2つ目のフォームを操作する時、特有のものなのでしょうか?それとも、2つ目のフォームの操作に限定されず、インスタンスの理解不足によって生じそうな問題なのでしょうか?
というのも質問に投稿したコードは、実際に扱っているコードではなく、実際に扱っているコードを単純化して、「RichTextBoxに文字列が追加されてはいるものの、UIに表示されない」という問題の原因の特定を簡単にしようとしたものなのです。
実際のコードも二つのFormを一画面に表示するようにしているのだとは思いますが、定かではありません。オープンソースに付け加えようとしている最中です。
どうやらもっと基礎的な部分の知識が足りていないようですね。
説明するのはなかなかしんどいので、紹介した下2つのURLを読み解くと理解できるはずです。
このような「FormHogeが他のフォーム、FormFugaの中でうまく表示されない、表示されても変数が渡されない」系?の質問はteratailでも頻出ですね。
既にコメントいただいているようにインスタンスの概念を理解するのが先決ですが、加えて、基本的にForm2.Designer.csのような (フォームのクラス名).Designer.cs のファイルはVisual Studioによって自動的に生成されるものなので、切り離して考えた方が良いと思います。
初心の方であれば尚更で、InitializeComponentメソッドで何が行われているかを調査したりなど、余程のことが無い限り *.Designer.cs を意識することはないし、手動で修正することはほとんどありません。深く理解したいならば意識してもいいのでしょうけど、インスタンスの概念を理解されてからですね。
>どうやらもっと基礎的な部分の知識が足りていないようですね。
説明するのはなかなかしんどい
インスタンスというのは、オブジェクトの構造を複製している
という理解をしているのですが、それは間違っているのでしょうか?
或いは、やはり不十分な理解でしょうか。
RichTextBox richTextBox = _form2.A()とすることで、
Form2.Designer.csで作った、richTextBoxを、表示位置や、richTextBox.Location,Nameなどの
情報をそのままに、他のファイルに渡せるという理解をしています。
しかし、その理解は正しくない、あるいは不十分なので、意図した通りの振る舞いをしない
のだと思っています。
これらの問題と、インスタンスがどう関わってくるのかを説明するのも
簡単なことではないのでしょうか?
ネットで調べている限りは、自分の理解力では、最初に書いたようなインスタンスの理解しかできない気がするのですが。
>FormHogeが他のフォーム、FormFugaの中でうまく表示されない、表示されても変数が渡されない」系?の質問はteratailでも頻出
そうなのですね。調べてみても情報がなかなか出てこないので、場合によっては、VisualStduioや.NETのバージョンによる問題なのかとも思いかけました。
ネットでは検索しにくい故のteratailでの質問なのでしょうか。
自分の場合、FormHogeのコードの通り、表示されていて、値なども別のファイルに渡されているのに、他のファイルで操作した通りにUIが表示されていない状態です。それも、本質的には同じ原因なのでしょうか。
>初心の方であれば尚更で、InitializeComponentメソッドで何が行われているかを調査したりなど、余程のことが無い限り *.Designer.cs を意識することはないし、手動で修正することはほとんどありません。
ChatGPTにも同じようなことを言われました。
今行っていることは、オープンソースのコードにほかの機能を付け加えようとしているところでありました。成行き的に、.Designer.csファイルを変更するのは、自然なことだったのですが、触らない方が無難なのですね。それはデザインファイルで変更すればよい、ということなのでしょうか?それとも別の理由でしょうか?
> オープンソースに付け加えようとしている最中です。
差し支えなければurlと実際にやりたいことを教えていただけますか?
提示コードは不足部分(Program.csやShowForm2Modalの呼び出し等)があって、どういう動作を期待しているかが推測しきれないです。
動作するコードがあれば、案外簡単に解決できるかもしれません(できないかもしれません^^;
@質問者hatteさん
回答ではなくてコメントばかりで混乱させてしまうようにも思ったので、コメントの連投に躊躇してしまうのですが、
> 成行き的に、.Designer.csファイルを変更するのは、自然なことだったのですが、触らない方が無難なのですね。それはデザインファイルで変更すればよい、ということなのでしょうか?それとも別の理由でしょうか?
.NET のWindows Formsデスクトップアプリの開発では一般的に、成り行きで*.Designer.csファイルを手動で変更するのは、少し不自然なことに思えます、
Visual Studio 20xxではWindows Formsの画面レイアウトの修正は、「Windows フォーム デザイナー」と言うものを使います。
https://learn.microsoft.com/ja-jp/visualstudio/designers/windows-forms-designer-overview?view=vs-2022
これを使うのが一般的ですが、このツールを使うと*.Designer.cs は自動的に編集、書き換わります。
手動でファイルを編集してしまうと、意図せずその編集が破棄されてしまうことがあります。なので、それが理由です。
質問者hatteさんの使われている開発環境は何なのでしょう。Visual Studio 20xxなのか、Visual Studio Codeなのか、ターミナルでdotnetコマンドを手動で実行しているのか。
その、修正したいオープンソースにはプロジェクトファイル *.csproj やソリューションファイル *.sln が付属していませんでしたか? ビルドの方法など、READMEなどに記載されていませんでしたか?
.NET (.NET Core)ベースのものと、.NET Frameworkでは異なることもあります。
「デザインファイル」と言われているものですが、ここでは何を指しているでしょうか。C#のデスクトップアプリ開発ではあまり聞きませんが、
WEB制作などでの画面設計を示すものを指していますか。
もし、C#/Windows Formsデスクトップアプリの開発に不慣れなら、いきなり既存のオープンソースプロジェクトの修正をするのではなく、簡単な新規のWindows Formsアプリを作って理解に努めるのも手です。(と、言いますか私ならそう薦めます)
質問者hatteさんの習熟状況が分かりづらい感じがするのも、まだ回答が付かない理由のひとつかもしれません。
>習熟状況に関して。
Web系の言語を少し知っている程度で全くの初心者です。Visual Studio2019の.NET Frameworkの確かバージョン4?という古いものを使っています。これは、触れているオープンソースがそれでしか扱えないようだったので、そうしています。それでしか扱えないと思い込んでいるだけの可能性もありますが。
>ここで言うデザインファイル。
デザインファイルが文脈によって意味が変わることを知りませんでした。ここでは、コードではなく、UIを直接配置したり、サイズを変えたりと、直感的に扱うことができ、それをVisual Stduioがコードに変換してくれるツールのことを指しています。
>簡単な新規のWindows Formsアプリを作って理解に努めるのも手。
その通りとは思います。しかし、高慢な考えと感じられるでしょうが、これからプログラミングを始めていきたいわけではないので、自分直面した問題を解決するための基礎知識を習得するためなら時間を割きますが、関係ないことまで全般的に勉強することが性格上できません。関係ある知識でも、関係なさそうと感じると理解ができるものも出来ません。
また、実際に扱っているコードを複雑な状態から、関係のありそうなものだけ抜き出し、簡単にする、という意味では、おっしゃるようにまず簡単なアプリの制作を始めているといえるのではないかと考えています。(思い込んでいる)
.Designerファイルを直接触っている理由。
何故かデザインファイルを開くことができなくなった。原因不明。
また、開けていた時も、ファイルが分割されているため、どれに変更を加えてよいかわからなかった為。
簡単にしたコードですが、少し理解が変わり、それに伴って、コードもいくらか変わりました。新しく質問を立て直した方がよいか、最初に投降したコードを編集によってざっくり変えたほうが良いのか、ただいま悩んでおります。
今は、Formを二つ用意して、それぞれ独立させて表示しています。
ですが、今は、Form2に相当するものをFormを継承するのではなく、UserControlを継承することで、FormにControls.Addすることで、ウインドウを一つにしました。
実際に扱っているコードもそうなっていて、最近になって、FormにFormをAddできないことを知りました。
☆☆☆
ChatGPTのやり取りで、RichTextBoxがUserControl内にあるため、そのRichTextBoxにテキストを追加しても、UserControl自体がFormに追加されていない限り、UIに表示されません。
という返答がありました。何か、これが関係しそかも、とも思うのですが、同じ質問をすると、コードに問題はないといわれたり、試しても、何も変わらない提案をされたりしているので、信用できません。それっぽいことを言っているような感覚はあるのですが、なにかピンとくることがありますでしょうか?
しばらく、ここはそのままにして、自分で調べてみます。
コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。変更点はForm1.csとForm2.csのみだと思います。
しかし、抱えている問題は依然そのままです。
Debug.WriteLineによる出力では、文字列が追加されていることが確認できるのに、UIには変更が反映されていない、という問題です。
質問の内容の編集、ファイルの中身を変更したことで、分かりやすくなったのか何も変わらないのか私には判りませんが...。
> コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。変更点はForm1.csとForm2.csのみだと思います。
これは私の回答宛ということでよろしいでしょうか?
そうであれば「回答のコメント欄」のほうにお願いします。
> しかし、抱えている問題は依然そのままです。
> Debug.WriteLineによる出力では、文字列が追加されていることが確認できるのに、UIには変更が反映されていない、という問題です。
> public Form1(ClassA classA)
のclassAがどこから来ているかが不明です。
通常Program.csに書かれますが、Program.csをいじっているなら必要な情報です(ほんとにProgram.csもいじってます?)
> FormにControls.Addすることで、ウインドウを一つにしました。
classAをAddしている形跡がありません。
別の場所でAddしているなら、それも必要な情報です。
もしデザイナで設置しているのであれば、_classAとは別の名前(classA1等)になっています。
> 今は、Form2に相当するものをFormを継承するのではなく、UserControlを継承することで、FormにControls.Addすることで、ウインドウを一つにしました。
回答の動画通りデザイナ上で操作するなら簡単に実現できるのですが、何か変わった作りになっているのであればその辺の情報がないと回答できません。
何が変わった作りかがわからないとは思いますが、上記2点はイレギュラーではあります(悪いわけではありません)
回答1件
あなたの回答
tips
プレビュー

