【C#】VisualStudio2022いじる その2<DataGridViewで表示>

Qiita @mag様のSerialTestをベースにさせていただいて、シリアル受信データの各種処理を学習してます。
今回のその2は、原作は、textBoxに記録しているのですが、これをExcelライクな数表であるDataGridViewに
書込むコードを追加しました。

●特徴
1:受信データは、ASCIIで1行にカンマ区切りで何個でも大丈夫です。
2:データ行数を行ヘッダに表示します。
3:データ行数の限界は、C#のメモリー次第ですので、数万行は大丈夫ですが、3万行付近から表示が遅くなります。
4:コピーしてEXCELにペーストできるので、CSVファイルにしなくても即EXCELでデータ加工できます。(Ctrl-Cでコピー)
5:ボーレートは115200になってます、ご自分でコードを変更してください。button1_Click内です。
6:応答周期はPCの速度次第ですが、遅い機CPUでも10msec周期くらいは大丈夫です。データ長が数十バイトの場合ですが、

以降:その3で、CSVファイルへの保存、読み取り機能もつけます。
以降:その4で、右クリックで、データ行編集機能をつけます。(Delete,Insert,Copy,Paset)
※2022/7/29修正 「DGVをコピー(ctrl-C)してExcelに貼り付けができない場合」
行末にCRLFがついているデータの場合は、コピペがうまくいかないのを修正しました。
参考にさせていただいたサイトに感謝:http://nanoappli.com/blog/archives/7525

※2022/7/29 マイコンと接続時に、通常マイコンでprintln()をすると/r/nなので、C#では、readLineデフォルトは¥nなので正確には
¥r¥nですが、¥nでも受信読み込みはできますが、文字列最後に¥rがついてますので注意です。

serialPort1.NewLine = “¥r¥n”;  //WIndowsでは、¥が改行マーク
string str = serialPort1.ReadLine();
改行マークが、arduinoとVBとC#が異なるので、注意です。参照させたいただいたサイト様https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/999envnewline/envnewline.html

●追加したコード
Response関数のelse以下がデータ表示部なので、そこにdgv1を追加しました。
下記コードをコピーすると全角が混じるので、プログラムエラーになるので、
gistからコードコピーしてください。
https://gist.github.com/dj1711572002/33853cb363f159febab9ed6af6e0075c

フォームをつくるのが面倒なら、プロジェクト全部ZIPでダウンロードしてください。
SerialDGV_03

private void Response(string text)
{
if (textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(Response);
BeginInvoke(d, new object[] { text });
}
else
{
// textBox1.AppendText(text + “\n”);
//===============データグリッドビュー dgv1へ記録===================
string[] data =( text+”,\n”).Split(‘,’);//カンマ区切りにばらす
int cN = data.Length;//列長さ 

if (rN == 0)//行カウントrN==0のときdgv1定義
{
        dgv1.ColumnCount = cN ;
        dgv1.RowCount = 2;
        dgv1.RowHeadersWidth = 100;
       //行末にCRLFがある場合、コピーがうまくいかないので、下記行を追加します         dgv1.Columns[0].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
}

rN++; 
dgv1. FirstDisplayedScrollingRowIndex = rN;//現在行の表示位置を固定したdgv1.Rows.Add(data);//この関数だけで、データ配列の入力と行の追加ができます。dgv1.Rows[rN].HeaderCell.Value = rN.ToString();//行ヘッダへ行番号
//=================================================================

}
}

●DataGridViewの設置と使い方
①コントロールですので、フォームに、ツールボックスからドラッグして登録します。
②DataGridView1と長々しい名前が面倒なので、Propertyを開いて、デザイン>nameでdgv1 という名前に変更してください、コードが全部 dgv1になってますので、名前変更しないと走りません。

③初期設定は、プログラム内で全部やっているので、Propertyをいじる必要はありませんが、
サイズをご自分の使い勝手に合わせて調整してみてください。

●dgv1の動作
青太文字で説明
ここでは、受信データ textが1行入ってきたときの動作を書いてあります。

//===============データグリッドビュー dgv1へ記録===================
string[] data =( text+”,\n”).Split(‘,’);//カンマ区切りにばらす
int cN = data.Length; //String配列dataの個数cNを得る
//rNは、グローバル宣言された整数で現在行のカウンタ

if (rN == 0)//行カウントrN==0のときdgv1定義初回だけ実行
{
dgv1.ColumnCount = cN ;//列数決める
dgv1.RowCount = 2;//初回の行数を2行だけ確保
dgv1.RowHeadersWidth = 100;//行ヘッダ幅を広くとる行番号が桁が大きいため//行末にCRLFがある場合、コピーがうまくいかないので、下記行を追加します
dgv1.Columns[0].DefaultCellStyle.WrapMode = DataGridViewTriState.True;

}rN++;//行をカウントアップ
dgv1. FirstDisplayedScrollingRowIndex = rN;//最上部の行に現在入力している行を表示する設定だが効いてないdgv1.Rows.Add(data);//行を追加してdata配列を入力dgv1.Rows[rN].HeaderCell.Value = rN.ToString();//行ヘッダーにその行の番号入力
//=================================================================

マイコンから2データを入力した場合

●以後
その3でCSV機能とその4で行編集機能をつけます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です