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

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

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

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

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

260閲覧

別のクラスからRichTextBoxに文字列を追加する方法が知りたい。

hatte

総合スコア4

.NET

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

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2024/04/14 06:59

実現したいこと

RichTextBoxの表示位置やサイズなどを作成したクラスとは別のクラスで、でRichTextBoxのUIにAppendし、追加した文字列をUIに表示させたいです。

何故別のクラスである必要があるのか、についてですが、別のクラスからではないといけないと思い込んでいるからで、本当は、別のクラスからでなくとも良いのかもしれないです。
ただ、何ができて何ができないのかなど、C#・プログラミング言語に明るくないので、ひとまず、別のクラスから文字列を追加する方法を知りたいです。

発生している問題・分からないこと

public void B()内のDebug.WriteLineの結果は、test:System.Windows.Forms.RichTextBox, Text: void BHello, World!のようになっています。

しかし、UIには文字列が追加されていません。

該当のソースコード

C#

1//Fomr1Designer.cs 2namespace NewApp 3{ 4 partial class Form1 5 { 6 private System.ComponentModel.IContainer components = null; 7</param> 8 protected override void Dispose(bool disposing) 9 { 10 if (disposing && (components != null)) 11 { 12 components.Dispose(); 13 } 14 base.Dispose(disposing); 15 } 16 #region Windows Form Designer generated code 17 private void InitializeComponent() 18 { 19 AutoScaleDimensions = new SizeF(7F, 15F); 20 AutoScaleMode = AutoScaleMode.Font; 21 ClientSize = new Size(800, 450); 22 Name = "Form1"; 23 Text = "Form1"; 24 ResumeLayout(false); 25 this.classA = new NewApp.ClassA(); 26 this.Controls.Add(this.classA); 27 } 28 29 #endregion 30 private NewApp.ClassA classA ; 31 } 32} 33

C#

1//Form1.cs 2using System.Diagnostics; 3using System.Windows.Forms; 4using static System.Net.Mime.MediaTypeNames; 5namespace NewApp 6{ 7 public partial class Form1 : Form 8 { 9 //private Form2 _form2; 10 private ClassA _classA; 11 //public Form1(Form2 form2) 12 public Form1(ClassA classA) 13 { 14 _classA = classA; 15 InitializeComponent(); 16 B(); 17 } 18 public void B() 19 { 20 RichTextBox richTextBox = _classA.A(); 21 richTextBox.AppendText("void B"); 22 _classA.A().AppendText("Hello, World!"); 23 _classA.A().Refresh(); 24 Debug.WriteLine("test" + _classA.A()); 25 } 26 } 27} 28

C#

1//ClassA.Designer.cs 2using System; 3using System.Windows.Forms; 4namespace NewApp 5{ 6 partial class ClassA 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 richTextBox = new RichTextBox(); 22 TabPagerich = new TabPage(); 23 tabControl1 = new TabControl(); 24 button1 = new Button(); 25 TabPagerich.SuspendLayout(); 26 tabControl1.SuspendLayout(); 27 SuspendLayout(); 28 // 29 // richTextBox 30 // 31 richTextBox.Dock = DockStyle.Fill; 32 richTextBox.Location = new Point(3, 3); 33 richTextBox.Name = "richTextBox"; 34 richTextBox.Size = new Size(386, 266); 35 richTextBox.TabIndex = 0; 36 richTextBox.Text = ""; 37 // 38 // TabPagerich 39 // 40 TabPagerich.Controls.Add(richTextBox); 41 TabPagerich.Location = new Point(4, 24); 42 TabPagerich.Name = "TabPagerich"; 43 TabPagerich.Padding = new Padding(3); 44 TabPagerich.Size = new Size(392, 272); 45 TabPagerich.TabIndex = 0; 46 TabPagerich.Text = "RichText"; 47 TabPagerich.UseVisualStyleBackColor = true; 48 // 49 // tabControl1 50 // 51 tabControl1.Controls.Add(TabPagerich); 52 tabControl1.Location = new Point(12, 12); 53 tabControl1.Name = "tabControl1"; 54 tabControl1.SelectedIndex = 0; 55 tabControl1.Size = new Size(400, 300); 56 tabControl1.TabIndex = 0; 57 // 58 // ClassA 59 // 60 AutoScaleDimensions = new SizeF(7F, 15F); 61 AutoScaleMode = AutoScaleMode.Font; 62 Controls.Add(button1); 63 Controls.Add(tabControl1); 64 Margin = new Padding(4, 3, 4, 3); 65 Name = "ClassA"; 66 Size = new Size(495, 372); 67 TabPagerich.ResumeLayout(false); 68 tabControl1.ResumeLayout(false); 69 ResumeLayout(false); 70 } 71 private System.Windows.Forms.RichTextBox richTextBox; 72 private System.Windows.Forms.TabPage TabPagerich; 73 private System.Windows.Forms.TabControl tabControl1; 74 #endregion 75 private Button button1; 76 } 77} 78

C#

1//ClassA.cs 2using System; 3using System.Diagnostics; 4using System.Windows.Forms; 5using static System.Net.Mime.MediaTypeNames; 6 7namespace NewApp 8{ 9 public partial class ClassA : UserControl 10 { 11 public ClassA() 12 { 13 InitializeComponent(); 14 } 15 public RichTextBox A() 16 { 17 return richTextBox; 18 } 19 } 20} 21 22

C#

1//Program.cs 2namespace NewApp 3{ 4 internal static class Program 5 { 6 [STAThread] 7 static void Main() 8 { 9 ApplicationConfiguration.Initialize(); 10 ClassA classA = new ClassA(); 11 Application.Run(new Form1(classA)); 12 Application.Run(); 13 } 14 } 15} 16

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

stackoverflowでCan't add to a RichTextBox from another class?というページや、そのほか慣例ページを見ました。
自分に起きている問題と同じ、或いは似ていると思うのですが、コードの詳細が簡略化されており、こちら側で応用することが叶いませんでした。
今のところ漠然と、インスタンスの作成の仕方や、処理の順番のによる問題なのかなと思っています。

ChatGPT3.5には、私の伝え方がなっていないためか、見当違いと思われる、たくさんの返答をいただきました。

補足

プログラミング言語自体全くの初心者です。
インスタンスに関しての理解は、用意した構造体を複製したモノ、という程度の理解しかありません。

上記のコードは実際に扱っているコードを、今回の問題に関係ありそうな部分を取り出して、できるだけ同じ構造になるように単純化したものです。

提示した、上記コードはVisual Studio2022を使用していますが、実際には
Visual Studio2019、.NET Framework ver 4.0を使用しています。

実際に扱っているコードはオープンソースのものです。
深い理由はないですが、何を扱っているかのURLは提示しないつもりです。複雑なことに対して、私が混乱しそうなので。

実際の環境では諸事情で、デザイナーズファイルを使用して、コードを追加するということが出来なくなってしまいました。

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

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

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

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

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

YAmaGNZ

2024/04/14 07:35

Mainを変更されているようですが何か目的があって変更されているのでしょうか? 通常であればこのような変更は行わないので目的があって変更しているのであれば教えていただきたいと思います。 なんとなくこの変更のせいでインスタンスのことも理解できていない状態でこんがらがっているように思えます。
hatte

2024/04/14 10:20 編集

コメントありがとうございます。 Mainを変更している目的はありません。 提示したコードに至るまでに紆余曲折があり、ChatGptと二人三脚でやっていたので、その過程で変更を加えていました。 また、なぜそのような変更をしたのかやコードに関してですが、理屈は理解できていません。一先ず、おまじないを唱えるような認識です。 上記のコードであれば、本来どうなっているべきなのでしょうか?また、変更に目的がない場合、Main関数の修正が、私の抱えている問題の解決につながりますでしょうか? また、「なんとなくこの変更のせいでインスタンスのことも理解できていない状態でこんがらがっているように思えます」とのことですが、もし可能であれば、その辺りのこと、何故そう直感?されたのか、お聞きしたいです。 期待通りには動いたものの、何故、最初のコードではダメだったのか、修正したらなぜうまくいったのかが、理解にはまだ及んでいないので(勿論、時間をかけて勉強を試みるつもりではいます)、ぜひお聞きしたいのです。 よろしくお願いします。
hatte

2024/04/14 10:22

すみません、コメントをする場所が適切ではなかったかもしれません。
fana

2024/04/15 04:31

> 提示したコードに至るまでに紆余曲折があり、ChatGptと二人三脚でやっていたので、その過程で変更を加えていました。 > また、なぜそのような変更をしたのかやコードに関してですが、理屈は理解できていません。一先ず、おまじないを唱えるような認識です。 個人的な感覚でしかない話で恐縮ですが…… なんというか,ひとまず ChatGpt とやらとは早々に手を切り,最低限の基礎的な部分に関してはより適切な手段を用いて習得するのが良いのではなかろうか,とか思いました.
guest

回答2

0

何も目的がないのであればVisualStudioにて自動生成される部分に変更を加えるのはお勧めしません。
なのでProgram.csやDesigner.csを変更するべきではありません。

提示されている例ですとClassAというユーザーコントロールを作成し、フォームデザイナーにてForm1に追加するだけでいいはずです。
そしてBというメソッドを作成し

C#

1 public void B() 2 { 3 RichTextBox richTextBox = classA.A(); 4 richTextBox.AppendText("void B"); 5 classA.A().AppendText("Hello, World!"); 6 classA.A().Refresh(); 7 Debug.WriteLine("test" + classA.A()); 8 }

といった感じに記述するだけでいいはずです。(デザイナーにて追加したコントロールのNameプロパティをclassAとした場合)

またコードにてコントロールを追加する場合は

C#

1 public Form1(ClassA classA) 2 { 3 InitializeComponent(); 4 _classA = classA; 5 this.Controls.Add(_classA); 6 B(); 7 }

という感じでthis.Controls.Add(_classA)とコンテナ(フォームやパネル等)に対して追加しないと表示されません。

投稿2024/04/14 08:24

YAmaGNZ

総合スコア10259

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

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

hatte

2024/04/14 10:09

ご回答ありがとうございます。 教えられた通りのコードで解決いたしました。 デザイナーFileなどを変えるべきではないというのは、Visual Stduioにも記されていたり、ほかの質問者の方々や、ChatGPTにも言われました。私の認識では、デザイナーファイルを変更した方がコードを変更するよりも「楽」という程度の認識だったのですが、どうも、デザイナーファイルを変更すると「苦」になるので、やめた方が良いという認識の方が近いのでしょうか。 もう一つお聞きしたいのですが、Program.csの中身ですが、この構成であれば、本来どうなっていたのでしょうか?初期状態を覚えていないのです。 ApplicationConfiguration.Initialize(); ClassA classA = new ClassA(); Application.Run(new Form1(classA)); この3行でしょうか?
YAmaGNZ

2024/04/14 11:33

フォームを新規に作成した場合、コンストラクタに引数はありません。 なので Application.Run(new Form1()); となっているはずです。 またClassAを作成するコードも存在しないはずです。 そのあたりは別に新規でプロジェクトを作成すれば確認できます。
YAmaGNZ

2024/04/14 11:43

また自動生成されるものを変更すべきではないというのは、フォームデザイナーなど自動生成されたコードを元に表示すべきものを表示しているので下手に変更するとフォームデザイナー自体が使えなくなったりします。 知識があってもデザイナーファイルを変更することはまずありません。コードで変更するよりデザイナーで変更したほうが楽ですし、もし大量のコントロールを作成したいというのであればコードで生成することになりそのコードはDesigner.csを変更するのではなく通常のコードに記載することになります。
guest

0

ベストアンサー

ClassAのインスタンスが2つできています(newがあるところ)

Program.csでClassA classA = new ClassA();がひとつ目、
Form1.Designer.csでthis.classA = new NewApp.ClassA();がふたつ目です。

見えているものはいじった(AppendTextした)ものではないということです。

普通はデザイナで置いたものをいじればいいんですが、わざわざProgram.csで渡しているということはそれを使うべきなのでしょう。

Controls.Add(_classA);を追加してください。
デザイナで置いたclassAは削除してください。

cs:Form1.cs

1using System.Diagnostics; 2using System.Windows.Forms; 3 4 5namespace Qr9k8rk196xmcbr 6{ 7 public partial class Form1 : Form 8 { 9 private ClassA _classA; 10 11 public Form1(ClassA classA) 12 { 13 // ↑のclassAはFomr1.Designer.csにある「private NewApp.ClassA classA;」 14 // とは同名だが別の変数(ややこしいのでForm1(ClassA c)とかに変えましょう) 15 _classA = classA; 16 17 // Program.csから渡されたclassA(_classA)はAddされていない。 18 // Addすれば予想通り出る(この場合C()は不要だしデザイナで置いたclassAも不要) 19 Controls.Add(_classA); 20 21 InitializeComponent(); 22 B(); 23 24 // デザイナで置いたclassAを使用するならB()やProgram.csの変更も不要だが、 25 // 何かしらの理由があってそうなっているのだろうから、おそらくこれではまずいんでしょう。 26 //C(); 27 } 28 29 // Program.csから渡されたインスタンスを使用する 30 public void B() 31 { 32 RichTextBox richTextBox = _classA.A(); 33 richTextBox.AppendText("void B"); 34 _classA.A().AppendText("Hello, World!"); 35 //_classA.A().Refresh(); 36 Debug.WriteLine("test" + _classA.A()); 37 } 38 39 // デザイナで置いたインスタンスを使用する 40 //public void C() 41 //{ 42 // RichTextBox richTextBox = classA.A(); 43 // richTextBox.AppendText("void C"); 44 // classA.A().AppendText("Hello, World!"); 45 // //classA.A().Refresh(); 46 // Debug.WriteLine("test" + classA.A()); 47 //} 48 } 49}

cs:Form1.Designer.cs

1using System.Drawing; 2 3 4namespace Qr9k8rk196xmcbr 5{ 6 partial class Form1 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 AutoScaleDimensions = new SizeF(7F, 15F); 22 AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 23 ClientSize = new Size(800, 450); 24 Name = "Form1"; 25 Text = "Form1"; 26 ResumeLayout(false); 27 //this.classA = new Qr9k8rk196xmcbr.ClassA(); 28 //this.Controls.Add(this.classA); 29 } 30 31 #endregion 32 //private Qr9k8rk196xmcbr.ClassA classA; 33 } 34}

アプリ画像

投稿2024/04/14 08:06

編集2024/04/14 08:21
TN8001

総合スコア9326

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

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

TN8001

2024/04/14 08:14

> 実際の環境では諸事情で、デザイナーズファイルを使用して、コードを追加するということが出来なくなってしまいました。 いじってしまった結果デザイナが開けないならわかりますが、もう一度取得しなおせば開けるようになりませんかね? この先もデザイナなしでやるとなると、かなりつらそうですが...
setoppu

2024/04/14 08:30

ユーザーコントロールとかは一度ビルドされたあとでないとフォームデザイナーがエラーになったような。 今回の場合、ClassAのrichTextBoxはPrivateなんだからClssAに操作用のPublicメソッドを用意するべきなんじゃないかなぁ。とか思いますが。 コントロールをPublicメソッドの戻り値で返すならPrivateにする意味がなさそう。
TN8001

2024/04/14 08:39

@setoppuさん いやまあ思うところはあるんですが、最小限の変更でないと質問者さんが混乱するようなので^^; 閲覧者向け 関連質問 [.NET Formアプリで、文字列をAppendTextメソッドを使って、RichTextBoxに追加し、UI上に文字列に表示させたい。](https://teratail.com/questions/9r9sq3i79y5jib)
hatte

2024/04/14 10:34

コメント、ご回答ありがとうございます。また、前回に引き続き助言をくださったことに深く感謝します。 こちらのやり方でも、期待通りに動作しました。 何故、自分のコードではダメだったのか、なぜ教えていただいたコードでは動作したのかを暫く、見つめなおしたいと思います。 publicやprivateの設定に関してですが、外部からアクセスすることを許可するかしないかという意味という認識をしています。 回顧すると、「ただ、なんとなく外部からのアクセスを許可すると、なんとなく無知な自分にはたたりそう」という理由で、privateにしたのだと思います。なので、深い理由はないです。きちんと使い分けないと長期的にはだめですよね。 私はプログラミングを必要に駆られたときにしか使う気がないので、深く勉強する気になれないというところが、なんとも...。消火器みたいなものですね。使う機会がなければ、それに越したことはない、みたいな。
hatte

2024/04/14 12:02

>わざわざProgram.csで渡しているということはそれを使うべきなのでしょう いえ、そうすべくして、そうしたというより、ChatGPTの言うことを黙ってコピーアンドペーストした結果そうなったのであって、元々のオープンソースがそうなっていた、というわけではないのです。 Program.csの記述がおかしい、普通ではやらないようなことをしているのでしょうか?
TN8001

2024/04/14 12:16

> こちらのやり方でも、期待通りに動作しました。 Program.csをいじっているのは、元コード(OSS)がそういう作りになっていたからだと思ったんですがそうではないんでしょうか?(ChatGPTがそういう回答をしたってこと??) そういうことであれば前回の回答のように、ほぼデザイナだけの操作でいいのですが... 「OSSのほうのプロジェクトでデザイナが開けないので、そういわれても困る」ということなら、開けるようにするのが一番近道な気がします。 > publicやprivateの設定に関してですが、外部からアクセスすることを許可するかしないかという意味という認識をしています。 これはsetoppuさんのコメントを受けての反応でしょうか? > private System.Windows.Forms.RichTextBox richTextBox; > public RichTextBox A() { return richTextBox; } これらがあんまり意味をなしてないという指摘ですね。 前回の回答でも書いた通りModifiersをpublicにすると、Designer.csは、 public System.Windows.Forms.RichTextBox richTextBox; と自動で変わります。 呼び出し側はメソッドを使わなくても、 _classA.richTextBox.AppendText("void B"); と直接アクセスできるようになります。 > 私はプログラミングを必要に駆られたときにしか使う気がないので、深く勉強する気になれないというところが、なんとも...。消火器みたいなものですね。使う機会がなければ、それに越したことはない、みたいな。 どうなんでしょうね。 私がプログラミングを始めたきっかけは昔のことなのであまり覚えていない(なんとなく面白そうだったから?)ですが、実際にプログラムを書ききったのは必要に迫られてなのは間違いないです。 C#で初めて作ったプログラムは今でも毎日使っています^^ 結局使う当てのないプログラムは途中で飽きてしまうんですよね^^; まあそこまでに欲しいけど作れなかったプログラムも結構あったはずですがw 少なくとも必要ないのに勉強するよりはずっといいですし、Windowsアプリに関してはC#+Visual Studioは最強の環境です。 がんばってください^^
TN8001

2024/04/14 12:27

書いている間に入違ってしまいました^^; > いえ、そうすべくして、そうしたというより、ChatGPTの言うことを黙ってコピーアンドペーストした結果そうなったのであって、元々のオープンソースがそうなっていた、というわけではないのです。 へーそんな謎コードを提案するんですね。 > Program.csの記述がおかしい、普通ではやらないようなことをしているのでしょうか? 普通はまずそういうことはしないと思います。 そういうことが必要なことはあるかもしれませんが、提示コードではこれで事足りる話です(さらに言えばデザイナで設置すればいいだけの話) public partial class Form1 : Form { private ClassA _classA; public Form1() { InitializeComponent(); _classA = new ClassA(); Controls.Add(_classA); B(); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問