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

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

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

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Q&A

解決済

1回答

337閲覧

.NET Formアプリで、文字列をAppendTextメソッドを使って、RichTextBoxに追加し、UI上に文字列に表示させたい。

hatte

総合スコア4

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

0グッド

1クリップ

投稿2024/04/10 14:59

編集2024/04/13 22:23

実現したいこと

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が働いていることが見て取れます。

補足

特になし

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

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

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

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

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

KOZ6.0

2024/04/10 15:49 編集

インスタンスについて理解が不足してらっしゃるように思います。 Form1 の B メソッドで _form2.Show(); とするとどうなりますか?
hatte

2024/04/10 16:04

期待した通り、UI上にTestvoid Bと表示されました! どういった理屈なのでしょうか? インスタンスや初期化などの概念、存在意義などが理解できていないことは分かっていたのですが、 根拠なく、 private Form2 _form2; public Form1(Form2 form2)や RichTextBox richTextBox = _form2.A();のような書き方で十分だと思い込んでいました。 初期化や、インスタンス関連によるものなのかとは思っていたのですが、簡単に調べる程度では、自分の問題とどう関係してくるのかが分からなかったですし、ChatGPTに聞いても、LocationやFillの問題、UIスレッドの問題、など、見当違いの回答ばかりで疲れ切っているところでした。
hatte

2024/04/10 16:41

ご丁寧にありがとうございます。 参考書の中に、「WindowsFormsアプリで2つ目のフォームを操作」というのがありますが、 今回の私が抱えた問題は、2つ目のフォームを操作する時、特有のものなのでしょうか?それとも、2つ目のフォームの操作に限定されず、インスタンスの理解不足によって生じそうな問題なのでしょうか? というのも質問に投稿したコードは、実際に扱っているコードではなく、実際に扱っているコードを単純化して、「RichTextBoxに文字列が追加されてはいるものの、UIに表示されない」という問題の原因の特定を簡単にしようとしたものなのです。 実際のコードも二つのFormを一画面に表示するようにしているのだとは思いますが、定かではありません。オープンソースに付け加えようとしている最中です。
KOZ6.0

2024/04/10 21:21

どうやらもっと基礎的な部分の知識が足りていないようですね。 説明するのはなかなかしんどいので、紹介した下2つのURLを読み解くと理解できるはずです。
dodox86

2024/04/11 02:58

このような「FormHogeが他のフォーム、FormFugaの中でうまく表示されない、表示されても変数が渡されない」系?の質問はteratailでも頻出ですね。 既にコメントいただいているようにインスタンスの概念を理解するのが先決ですが、加えて、基本的にForm2.Designer.csのような (フォームのクラス名).Designer.cs のファイルはVisual Studioによって自動的に生成されるものなので、切り離して考えた方が良いと思います。 初心の方であれば尚更で、InitializeComponentメソッドで何が行われているかを調査したりなど、余程のことが無い限り *.Designer.cs を意識することはないし、手動で修正することはほとんどありません。深く理解したいならば意識してもいいのでしょうけど、インスタンスの概念を理解されてからですね。
hatte

2024/04/11 06:36

>どうやらもっと基礎的な部分の知識が足りていないようですね。 説明するのはなかなかしんどい インスタンスというのは、オブジェクトの構造を複製している という理解をしているのですが、それは間違っているのでしょうか? 或いは、やはり不十分な理解でしょうか。 RichTextBox richTextBox = _form2.A()とすることで、 Form2.Designer.csで作った、richTextBoxを、表示位置や、richTextBox.Location,Nameなどの 情報をそのままに、他のファイルに渡せるという理解をしています。 しかし、その理解は正しくない、あるいは不十分なので、意図した通りの振る舞いをしない のだと思っています。 これらの問題と、インスタンスがどう関わってくるのかを説明するのも 簡単なことではないのでしょうか? ネットで調べている限りは、自分の理解力では、最初に書いたようなインスタンスの理解しかできない気がするのですが。 >FormHogeが他のフォーム、FormFugaの中でうまく表示されない、表示されても変数が渡されない」系?の質問はteratailでも頻出 そうなのですね。調べてみても情報がなかなか出てこないので、場合によっては、VisualStduioや.NETのバージョンによる問題なのかとも思いかけました。 ネットでは検索しにくい故のteratailでの質問なのでしょうか。 自分の場合、FormHogeのコードの通り、表示されていて、値なども別のファイルに渡されているのに、他のファイルで操作した通りにUIが表示されていない状態です。それも、本質的には同じ原因なのでしょうか。
hatte

2024/04/11 07:55

>初心の方であれば尚更で、InitializeComponentメソッドで何が行われているかを調査したりなど、余程のことが無い限り *.Designer.cs を意識することはないし、手動で修正することはほとんどありません。                                                      ChatGPTにも同じようなことを言われました。 今行っていることは、オープンソースのコードにほかの機能を付け加えようとしているところでありました。成行き的に、.Designer.csファイルを変更するのは、自然なことだったのですが、触らない方が無難なのですね。それはデザインファイルで変更すればよい、ということなのでしょうか?それとも別の理由でしょうか?
TN8001

2024/04/11 14:59

> オープンソースに付け加えようとしている最中です。 差し支えなければurlと実際にやりたいことを教えていただけますか? 提示コードは不足部分(Program.csやShowForm2Modalの呼び出し等)があって、どういう動作を期待しているかが推測しきれないです。 動作するコードがあれば、案外簡単に解決できるかもしれません(できないかもしれません^^;
dodox86

2024/04/12 07:23

@質問者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さんの習熟状況が分かりづらい感じがするのも、まだ回答が付かない理由のひとつかもしれません。
hatte

2024/04/13 16:33

>習熟状況に関して。  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に表示されません。 という返答がありました。何か、これが関係しそかも、とも思うのですが、同じ質問をすると、コードに問題はないといわれたり、試しても、何も変わらない提案をされたりしているので、信用できません。それっぽいことを言っているような感覚はあるのですが、なにかピンとくることがありますでしょうか? しばらく、ここはそのままにして、自分で調べてみます。
hatte

2024/04/13 22:29

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。変更点はForm1.csとForm2.csのみだと思います。 しかし、抱えている問題は依然そのままです。 Debug.WriteLineによる出力では、文字列が追加されていることが確認できるのに、UIには変更が反映されていない、という問題です。 質問の内容の編集、ファイルの中身を変更したことで、分かりやすくなったのか何も変わらないのか私には判りませんが...。
TN8001

2024/04/14 00:49 編集

> コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。変更点は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点はイレギュラーではあります(悪いわけではありません)
guest

回答1

0

ベストアンサー

今は、Form2に相当するものをFormを継承するのではなく、UserControlを継承することで、FormにControls.Addすることで、ウインドウを一つにしました。

それはだいぶ話が単純になりました(Formが複数あると「どう開くのか」や「閉じたらどうなるのか」等、考慮事項が増えます)

UserControl1内のRichTextBoxに、Form1のボタンから文字列を追加する例です(UserControl1の色を変えた深い意味はありません)
アプリ作成動画

RichTextBoxModifiersプロパティを変更するのがポイントです。
方法: Modifiers プロパティおよび GenerateMember プロパティを使用する - Windows Forms .NET Framework | Microsoft Learn

userControl11というのはUserControl1の1個目のインスタンスという意味で自動で付いた名前ですが、わかりにくければプロパティの(Name)で好きに変えられます。

アプリ動画


何故かデザインファイルを開くことができなくなった。原因不明。

例えばデザイナ上で設定したボタンのイベントハンドラ(private void Button1_Click(object sender, EventArgs e) { })を、Form1.csで削除したりするとForm1.Designer.csと矛盾しデザイナが開けなくなります。

そうならないように(デザイナ上でイベントクリアするなりボタンごと削除するなり)するべきですが、起きてしまって戻せない場合はDesigner.csのエラーになっている行を削除すれば大概は復帰します(復帰後は触らないようにします)

簡単にしたコードですが、少し理解が変わり、それに伴って、コードもいくらか変わりました。新しく質問を立て直した方がよいか、最初に投降したコードを編集によってざっくり変えたほうが良いのか、ただいま悩んでおります。

コメントや回答が付いた後の大幅な内容変更はマナー違反です(頓珍漢なコメントや回答をしているように見えるため)
大幅具合は主観でしかないですが、Form2からUserControlへの変更は大幅でしょうかね?(個人的には話が単純になってありがたい)

現コードを追記されてもいいかもしれません。

誘導された場合は従ったほうがいいでしょう(ただ「仕切り直します」のような「解決済」は役に立たないなと感じますが^^;

投稿2024/04/13 21:46

TN8001

総合スコア9326

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

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

TN8001

2024/04/14 00:48 編集

(コメントが無いと)↑の「コメント」を押さないと入力欄が出ないが、ココが回答へのコメント欄です。
hatte

2024/04/14 06:09

回答者の皆様、何より自分が、質問欄が混沌と化してしまったことで混乱してしまうので、本題の問題解決は改めて新しく投稿しようと思います。 この審問では、デザイナファイルが開かなくなった原因が分かったこと、解答欄に投降してくださったということでベスト案さにさせていただきました。 この行いが適切かどうかは分かりませんが。 他の皆様方も助言などありがとうございました。 また、新しく質問を立てようかと思いますので、ぜひご協力をお願いします。 大変失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問