データグリッドビューでいろいろやる
社内の製造進捗管理ツール的なものを作ってみる。
ガントチャート…とまではいかないにしても、タスクがあって、それがどんなタイミングで行われるかカレンダー的表示は欲しい。
試しにグレープシティのGanttViewを使ってみたが、探し方が下手くそなのか、これ、案外文献ないのな。
なんとかタスク登録はできた。カレンダー部分の表示は簡単…だが、見た目の変更はややこしそう。タスク表示部の文字位置の変更なんかも結局巧くできず。
プロパティ見る限りではその辺りの設定が見つからなかった…。
もう少し時間かければいろいろ見えてくることもあるだろうが、工数減らすためのコンポーネントを理解するために時間をかけるってのもちょっと。
見た目とかタスクの考え方を参考にさせて頂き、データグリッドビューでそれっぽいものを作ることにする。
そもそも、作業実施のタイミングをカレンダー表示できればそれでよいレベル。作業と作業の繋がりとかは現時点で必要ない。
こんな感じでどうかと。
ぼかし入れ倒しなのでわかりにくいが…。
予定を示す緑色の棒はデータグリッドビュー上にパネルコントロールを貼りつけて表示させている。各緑棒の説明はテキストボックス貼りつけ。データグリッドビューのスクロールに合わせて上下左右に追従するようにしている。
ポイントは下地のデータグリッドビューだが、単純にひとつのコントロールで済ませているわけではない。まぁ、見る人が見ればわかるだろうからもったいつけてもしょうがないが…。
実は3つのデータグリッドビューを並べて構成している。
左側のいわゆるタスク表示しているところ、グラフを表示しているところ、上のSSでは見えていないが右端にスクロールバー表示担当のデータグリッドビューの3つ。
この3つを連動して表示させることで、緑棒が左端や右端にいったときの処理をあんまり気にしないで済むようにしている。
ちゃんと緑棒を左右にドラッグして日程変更することもできるし、画面サイズの変更でもグラフ部の見た目が崩れることはない。自分的にはなかなかよくできた画面になったかなと。
問題はタスクが増えれば処理が重くなる…というところ。
1,000件ぐらいのタスクになるとそれだけグラフ用のパネルコントロールが増えるので、スクロール時なんかは画面がちらつきまくる。
なので、大量タスク用にキャラクター表示版も作成。
こんな感じ。
流石にドラッグしてグラフ部を動かす…といったことはさせてないが、まぁ表示としては十分かと。
で、Excelでの操作に慣れている人に使ってもらうには抽出の機能が要るなと。
SQLサーバからデータ引っ張ってくる時点でWHERE文で条件入れればよい話なのだが、SQLサーバへのSELECT文で結構ややこしいことしているので面倒くさそう&抽出の度に時間かかるな…と思っていたら、ちょっとお手軽な方法を見つけた。
データテーブルからSelectでRowdata()を作るやり方。
Dim HyojiDT As Datatable=New Datatable()
HyojiDT=TaskDT.Clone()
Dim seekstr As string=String.Format("{0}='{1}'","加工機","XXX")
Dim rows As Datarow()
rows=TaskDT.Select(seekstr)
For Each row As DataRow In rows
HyojiDT.ImportRow(row)
Next
Datagridview1.DataSource=HyojiDT
…みたいにすれば、SQLサーバからちょい複雑気味のSELECT文で引っ張ってきたデータを維持したまま後追い抽出みたいなことが可能。
AND、ORで複数の条件をつなぐことも可能。
元のデータテーブルを保持したままなのでメモリは多少食うだろうが、今のところ動作に支障が出るような状況はない。
処理的にもいろいろ応用が利きそうなので、過去のプログラムも見直してみることにする。