今更、あぁ、そうだったのか!、 と驚く事も多いです。
さて、 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 件のコメント:
コメントを投稿