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

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

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

Rx.NETは、リアクティブプログラミングが可能なライブラリの一つ。.NET Framework向けReactive Extensionsライブラリです。マイクロソフト社が初めてRxライブラリとして提供し、ここから多くの言語にRxが移植されるようになりました。

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

Q&A

解決済

1回答

527閲覧

C#ユーザーコントロール上のリストボックス追加

mitta

総合スコア1

Rx.NET

Rx.NETは、リアクティブプログラミングが可能なライブラリの一つ。.NET Framework向けReactive Extensionsライブラリです。マイクロソフト社が初めてRxライブラリとして提供し、ここから多くの言語にRxが移植されるようになりました。

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。

1グッド

0クリップ

投稿2023/05/04 07:10

実現したいこと

C# Windowsフォームアプリ(.NET6)にてデスクトップアプリを作っています。
シリアル通信で受信したデータを
複数のユーザーコントロールに張り付けたリストボックスやテキストボックスに
追加・変更したいのです

前提

下記コードを実行してもoddLb(リストボックス)にもevenLbにもデータが追加されません。

現状で追加はされませんがエラーは出ていません。

ネットで検索し、色々試したのですが
解決しなかったためご教授いただければ幸いです。。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

C#

1namespace RaingaugeNET7 2{ 3 public partial class Log : UserControl 4 { 5 6 7 public string? linktest; 8 9 public Log() 10 { 11 InitializeComponent(); 12 } 13 14 15 16//↓別のユーザーコントロールからメソッドを実行 17 public void logging() 18 { 19//メインフォームからデータの代入 20 string count = MainForm.CNT; 21 string flow = MainForm.FLW; 22 string contact = MainForm.CT; 23 string interval = MainForm.PI; 24 25 26 int countint = Convert.ToInt32(count); 27 28 string link = count + "_Flow=" + flow + "_Contact=" + contact + "_Interval=" + interval; 29 link = link.Replace("\n", "").Replace("\r", ""); 30 31 linktest = link; 32 Debug.WriteLine(linktest);//イミディエイトウィンドでデータが代入されていることを確認 33 34//リストボックスに追加されない 35 if (countint % 2 == 0) 36 { 37 oddLb.Items.Add(link); 38 } 39 else 40 { 41 evenLb.Items.Add(link); 42 } 43 44 45 } 46 47 private void testBtn_Click(object sender, EventArgs e) 48 { 49 testLbl.Text = linktest; 50//テスト用にテキストボックスに書き換えても 51すでにある文字が消える。 52 53 } 54 } 55} 56 57 58
TN8001👍を押しています

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

guest

回答1

0

ベストアンサー

//↓別のユーザーコントロールからメソッドを実行

ここがわからないので推測ですが、new Log().logging();のようなことをしていませんか?(フォーム間ではよくある話)

そうだとするとLogを新しく作っているので、今表示されているLogには何も起きません。
どうにかして今表示されているLogをとってくる必要があります。

方法はいくらでもありますし詳細が不明なので何とも言えませんが、例えばこうとか?(Logと別のユーザーコントロールが同じMainForm直で置かれているとして)

cs

1//new Log().logging(); // ダメ!! 表示されているLogではなく、新しいLogを作っている 2 3var mainForm = (MainForm)Parent; // 親がMainFormなら 4mainForm.log1.logging(); // どうにかして表示されているLogをとってくる(LogのNameがlog1なら)

LogModifiersを、publicinternalにしてください。
方法: Modifiers プロパティおよび GenerateMember プロパティを使用する - Windows Forms .NET Framework | Microsoft Learn


追記

こんなイメージです(関係ないところはバッサリカット)

cs

1using System.IO.Ports; 2 3namespace Q1d8jlq64jymrpv; 4 5public partial class MainForm : Form 6{ 7 SerialPort serialport = new SerialPort(); 8 SerialDataEdit sde = new SerialDataEdit(); 9 10 static public string CNT = ""; 11 static public string FLW = ""; 12 static public string CT = ""; 13 static public string PI = ""; 14 15 public MainForm() 16 { 17 InitializeComponent(); 18 } 19 20 private void Serialport_DataReceived(object sender, SerialDataReceivedEventArgs e) 21 { 22 try 23 { 24 if (sde.stringEdit(serialport.ReadLine())) 25 { 26 //chart.addpoint(); 27 log.logging(); 28 } 29 } 30 catch (Exception ex) 31 { 32 MessageBox.Show(ex.Message); 33 } 34 } 35} 36 37public class SerialDataEdit 38{ 39 string? SerialDataOriginal; 40 string? countData; 41 string? flowrateData; 42 string? contactTimeData; 43 string? pulseIntervalData; 44 45 int wait = 0; 46 47 public bool stringEdit(string? Arduino) 48 { 49 switch (Arduino?[0]) 50 { 51 case 'A': 52 MainForm.CNT = countData = Arduino[1..]; 53 wait++; 54 break; 55 case 'B': 56 MainForm.FLW = flowrateData = Arduino[1..]; 57 wait++; 58 break; 59 case 'C': 60 MainForm.CT = contactTimeData = Arduino[1..]; 61 wait++; 62 break; 63 case 'D': 64 MainForm.PI = pulseIntervalData = Arduino[1..]; 65 wait++; 66 break; 67 default: 68 countData = "0"; 69 flowrateData = "0"; 70 contactTimeData = "0"; 71 pulseIntervalData = "0"; 72 break; 73 } 74 75 if (wait == 4) 76 { 77 wait = 0; 78 return true; 79 } 80 return false; 81 } 82}

投稿2023/05/04 10:46

編集2023/05/05 03:28
TN8001

総合スコア8874

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

TN8001

2023/05/04 10:46

「そうじゃない」あるいは「よくわからない」ということなら、呼び出し側コードも質問に追記してください。
mitta

2023/05/05 05:14 編集

TN8001様 ご回答ありがとうございます。 現在、MainFormに二つのユーザーコントロールを張り付けて ボタンで表示切替を行っています。 シリアル通信したデータを変数に格納するクラスを作成して 受信が終わったら各ユーザーコントロールのメソッドを実行しようとしています。 下段に記載したSerialDataEditのクラスにある Log log = new Log();と log.logging();が問題でしょうか? ↓がMainFormのコードでこちらからはメソッドをユーザーコントロールlogのメソッドを実行していません。 public partial class MainForm : Form { SerialPort serialport = new SerialPort(); SerialDataEdit sde = new SerialDataEdit(); // グローバル変数 static public string CNT = ""; static public string FLW = ""; static public string CT = ""; static public string PI = ""; //フィールド変数 string? serialArduinoData; public MainForm() { InitializeComponent(); } private void Serialport_DataReceived(object sender, SerialDataReceivedEventArgs e) { try { serialArduinoData = serialport.ReadLine(); sde.Arduino = serialArduinoData; sde.stringEdit(); if (InvokeRequired) { Invoke(new Action(Updatetext)); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } public class SerialDataEdit//シリアル通信、受信データの切り取り編集 { string? SerialDataOriginal; string? countData; string? flowrateData; string? contactTimeData; string? pulseIntervalData; int wait = 0; public string? Arduino { get; set; } Chart chart = new Chart(); Log log = new Log(); public void stringEdit()//外部(別のクラス)から実行できるようにpublicにする。 { SerialDataOriginal = Arduino; switch (Arduino) { case string when SerialDataOriginal.IndexOf("A") == 0: countData = SerialDataOriginal.Substring(1); MainForm.CNT = countData; wait += 1; break; case string when SerialDataOriginal.IndexOf("B") == 0: flowrateData = SerialDataOriginal.Substring(1); MainForm.FLW = flowrateData; wait += 1; break; case string when SerialDataOriginal.IndexOf("C") == 0: contactTimeData = SerialDataOriginal.Substring(1); MainForm.CT = contactTimeData; wait += 1; break; case string when SerialDataOriginal.IndexOf("D") == 0: pulseIntervalData = SerialDataOriginal.Substring(1); MainForm.PI = pulseIntervalData; wait += 1; break; default: countData = "0"; flowrateData = "0"; contactTimeData = "0"; pulseIntervalData = "0"; break; } if (wait == 4) { chart.addpoint(); log.logging(); wait = 0; } }
TN8001

2023/05/05 02:03

コメントだとインデントがなくなって見にくいので質問に追記してください。 質問はいつでも何度でも編集できます。 文字数制限(1万字以内)があるので、本題ではない部分は省略して結構です。 > 下段に記載したSerialDataEditのクラスにある > Log log = new Log();と > log.logging();が問題でしょうか? はい。その通りです。 MainFormで「log.Visible = false;」としている「log」と、 SerialDataEditで「Log log = new Log();」としている「log」は、 まったく別のインスタンスです。 「chart」も同様ですが予定通り動いているのでしょうか? どうしますかねぇ?^^; イヤどうにでもなるのですが、どうするのがわかりやすく変更が楽でしょうか... あちこちで「log」を参照すると訳が分からなくなりがちなので、 public bool stringEdit() として if (wait == 4) { //chart.addpoint(); //log.logging(); wait = 0; return true; } return false; のようにstringEdit()がフラグを返すようにしてはどうでしょうか? MainForm側で「log.logging();」します。 try { serialArduinoData = serialport.ReadLine(); sde.Arduino = serialArduinoData; if(sde.stringEdit()) { chart.addpoint(); log.logging(); }
TN8001

2023/05/05 02:15 編集

//sde.Arduino = serialArduinoData; if(sde.stringEdit(serialArduinoData)) のように引数でデータを渡せば、プロパティで挿し込む必要もありません。 public class SerialDataEdit { //public string? Arduino { get; set; } public bool stringEdit(string? Arduino) { } }
mitta

2023/05/05 05:30

TN8001様 詳しいご教授ありがとうございます! 教えていただきましたコードに書き換えたところ完全に私が思う動作になりました。 今回学習させていただいた内容は メソッドの処理が終わったことをbool型のメソッドでフラグ確認する。 ユーザーコントロールのインスタンス生成はむやみにやらないほうがいい。 この三日間ずっとはまっていた問題でしたので大変助かりました! 今度何かお礼をさせてください!w 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.68%

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

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

質問する

同じタグがついた質問を見る

Rx.NET

Rx.NETは、リアクティブプログラミングが可能なライブラリの一つ。.NET Framework向けReactive Extensionsライブラリです。マイクロソフト社が初めてRxライブラリとして提供し、ここから多くの言語にRxが移植されるようになりました。

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

リストボックス

ユーザーがリストから1つ以上のアイテムを選択できるようにするGUI要素です。