2022年6月22日水曜日

C# DataGridView MultiLines

プログラムには、知ら無い事だらけ、忘れている事だらけ。
今更、あぁ、そうだったのか!、 と驚く事も多いです。
さて、 DataGridView で Cell に複数行を表示させる場合。
こんな事も出来たんですね、 しかし、 ... 。


知ら無い事、忘れている事、... 。
歩む道は奥深くて、分岐も一杯!。

プログラミングもそうですね。
先日、昔むかしの もの を動かして、そんな事もあったよね! と感一入。
早速、最近の環境下 で 試して見ると、いいじゃん!。
でも、便利な反面、実行速度の低下が ... 。


はい。  具体的に書きましょう。
Form の DataGridView で Cell のオーバーフロー時に複数行表示する方法です。
以下、利用言語は C# で例示しますが、VB.net でも同じです。
(勿論、VB.net では行末の ; は無いですし、宣言文も違いますけれど。)

コントロール dataGridView1 とします。
Cell の 5番目 に 不特定の長さの文字列 が格納されているとします。
最大文字数より短い幅で設定すると、実行時、
文字列は 適切に切り詰められ、最後に継続を意味する '...' が付加されますね。
利用者は項目幅を操作(拡張)する事も可能ですし、
溢れた箇所にマウスをフーバーする事で、全文の Tooltip が表示されます。

因みに、昔むかしの もの は VB2008sp1 で .xsd を使い .sdf からデータ取得しています。
最近の環境下 は VS2017 C# で .xml からのデータ取得です。  .xsd は未設定です。
  ('最近' が VS2022 では無くて、VS2017 なのが、ご愛嬌?。)

DataGridView では、Cell 毎に、オーバーフローさせずに、複数行表示させる設定も可能です。
以下の3行を書き加えます。  例では、5番目の列が対象です。

DataGridViewColumn column = dataGridView1.Columns[4]; // 5th Column
column.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
this.dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;

こうする事で、均一だった Row の高さは内容に応じて可変し、
全文を判別可能な状態で表示されますね。

いい事だらけ! ではありません。
実行速度の低下が見られます!。

そりゃぁ、そうですね。
だって、計算し無ければ、各行の高さを求められ無い訳ですから。
データ量にも依ると思いますが、
初期表示時と項目ソート時に、データ表示に遅延が生まれるのです。
今回の例では 12 Columns 1300 Rows 程度なのですが、
数秒待たないと内容が表示されません。
  もっと、爆速の CPU で 溢れる程の潤沢な物理メモリを積めば違うかも、ですが、
  試した環境は、其れ程、低スペックでは無い筈なのですが、其れでも、こんな調子です。  :O
と或る項目 を探す場合、
Scroll し乍ら 見付ける 事 を考えれば 相当 速い 筈ですが、
探す為に、項目列で並び変えるのは 常套手段 です。
元(オーバーフロー表示)に較べれば、
待たされる! と言った印象が強いです。
特に、項目に依るソートは 有益 であるだけに、
残念感 も 一入 なのです。

う~ん ... ですね。


結局、
初期状態は オーバーフローを認め、必要に応じて、複数行表示に切り替えも可能、としました。
DataGridView の表示方法をユーザーが選べる様にした訳です。
実行中に切り替えられる様な Control を追加したのですね。

  最も基本的な Control は Button だと思いますが、
  其れに限りませんね。
  ContextMenuStrip の ToolStripMenuItem を使って、
  Click Event に書くのもひとつの手ですし、
  此れに Keyboard の キー (例:F2 等)をバインドするのも手でしょう。
  ContextMenuStrip では無く、MenuStrip をひと通り揃えるのでも結構です。
  
  脱線しますが、
  GUI の構想は本当に難しいですね。
  幾つも道が考えられるので、持ち得る引き出しの数は多い程宜しいかと。



0 件のコメント:

コメントを投稿