2007年7月30日月曜日

グリッドのソートとフィルタ(2)

グリッドのソート機能をガシガシと設計実装中。
あらためてやってみると、実は結構頭を悩ませないといけないことが多いのがよーくわかった。

ライブラリの中で行えるソートってのはかなり色々考えておく必要があるので、普通にAPでやるように簡単にはソートを行えないんだよね。理由も簡単で、「比較対象となる値は本当に比較できるのか?」という部分。Stringだー、Integerだーという場合に限定して考えれば、それはたいした問題じゃない。だけどDataGridViewというコントロールである以上は、「セルの値はObject」というケースが多々あるわけで。つきつめると「Objectクラス同士では比較する方法はない」んだよね。そりゃそうなんだけど。比較する方法を判っているのは、その派生クラス側でしかないんだから。

てことでロジックとしてはこんな感じになりそう。

Nothingかどうかをチェックセルの値がIComparableを継承しているならCompareToメソッドを呼び出して、その結果が0(同一)でなければ結果として返却IComparableを継承していない際は、同一の値とみなして次の比較にうつる

大雑把に言えばこんな感じだろうね。実際に比較を行うのはそれぞれのクラスで行う必要があるから。

それで今の問題は「サブエディタ等の複数項目を保持しているクラスでの比較」。この場合は比較対象となる条件(というか項目)を渡してあげる必要があるんだけど、上のIComparableインターフェースと一緒に考えていくとどうもしっくりこない。その理由は「IComparableが単一の値と単一の値の比較」に用いるインターフェースだからなんだよなぁ・・・。

2007年7月28日土曜日

DataGridViewでソート

単純にソートする機能は元々持っていたから安心していたんだよね。

でもここ最近某MultiRowコントロールに近づけるために拡張したことによって、結構考えなければいけないハメに。MultiRowコントロールやそのほかのグリッド系コントロールは「セルをマージしてレイアウトを作成する」タイプなんだけど、今回自分が用意したのは「セルに好きなコントロールを表示する」方法だったので、セルに格納される値ってのが多種多様・・・つーかなんでもありw

今ではDataGridViewのセルの中にDataGridViewを出して、さらにその中に・・・なんてことも平気でできるようにしてしまったので、ことさらこの問題が顕著に。

気持ちとしてはExcelなどで行っている指定の方法がベターかな、なんて思っているのでそれに近い方法を用意しようとは思ったんだけど。項目名を指定させるところでちょっと悩む。
ヘッダのTextを名称として利用する、と統一とれれば楽なんだけどなぁ。今のところヘッダの拡張はやっていないからそこまで辿り着けていないんだよね。

しかしここまでDataGridViewを拡張して色々やっているけど、時代はもう3.0に突入しようとしているんだよね。2.0な世界をどこまでひっぱっていけることやら。

2007年7月27日金曜日

グリッドのソートとフィルタ

そろそろ、というかついにというか。残りに残っていたこの二つの話題を触る時がきてしまった・・・。

MultiLayoutのベータリリースによって、デザイン上の問題はほぼ対応できるメドがついたからなんだけど。

ソートもフィルタもどっちも地味に設計が難しい。元々のグリッド系コントロールの考え方としては、「ある項目でソート」「ある項目の値でフィルタ」というように、セルの値というのが非常に絡んでくる。ところが、だ。
MultiLayoutでは一つのセルに複数の値が設定されているんだよなぁ・・・。
そうなると、ソートを行う際に「そのセルのどの値」というところまで指定できないと、ユーザーが思うようなソートは掛けれないことになるんだよね。これはフィルタも同じで。

とりあえずはMultiLayoutの事を忘れてしまってソート処理から設計・実装していこうとは思う。AP側でソートの方法が固定できるなら、Decoratorパターンにしてしまってソート用のクラスを各自に実装してもらうのがいいんだろうけど。

2007年7月24日火曜日

ちょっとまてSharePointService

@ITの記事でSharePointService用にサイトのテンプレートが多数配布されていたことにいまさら気づいたorz

試しにインストールしてはみたけどその数と内容がすげぇ。

欠勤届および休暇スケジュール管理複数プロジェクト予算・進捗管理バグ データベースコール センター変更依頼管理法令遵守プロセス サポート サイト連絡先管理校閲用ドキュメント ライブラリイベント企画経費精算・承認ヘルプ デスク在庫管理IT チーム ワークスペース求人・面接管理サポート技術情報貸出図書物的資産管理プロジェクト管理ワークスペース部屋・備品の予約潜在顧客管理

・・・多すぎ。これを見て思ったけど、本当にこれからは「自前で色々作る」ではなくて「色々な製品を組み合わせて利用する」ってとこなんだなぁ、ってところ。大手がヤル気になったら中小企業じゃまともに対抗できんって。

2007年7月21日土曜日

ドラゴンナイト4

リメイクされてたのねぇ。色々と思い出深いタイトルだからちょっと調べてみたけど・・・なんというか今のエルフっぽい作品だなぁ。

戦闘シーンだけのリメイクだからねぇ。

やっていた当時は戦闘パートの難しさと、2週目がしっかりとした理由あっての事だったってのが好きだったねぇ。爆弾娘を一番鍛えたりw

んー、昔のまま出してくれた方が良かった気がするw

2007年7月20日金曜日

コントロールのキャプチャ

色々試した結果、どうやらCreateGraphicsメソッドの動作が根本の原因っぽい。ユーザーコントロールのインスタンス生成直後にCreateGraphicsメソッドを呼び出すと、変なGraphicsクラスのインスタンスを返してくれる。
というか、ユーザーコントロール自身がよくわからない動作なんだよなぁ。生成直後で表示されていないにもかかわらず、Visible=Trueとなっていたり。そのくせCreateGraphicsを行うと実際には表示されていないからデスクトップのキャプチャ結果が返ってくる。

仕方ないので呼び出し側で、想定される表示状態を指定してそれによってCreateGraphicsするかDrawToBitmapするかを分岐させるようにした。んー、なんか実装していて「これでいいの?」と悩むなぁ。

2007年7月16日月曜日

DataGridViewの編集

んー、いまいち流れがわからない箇所がある。

編集が終わってセルへ値を更新するタイミングがあるんだけど、サブエディタをしっかり作るに当たってそこがよくわからなくなってきた。編集コントロール側ではセルに対してどうのこうのはやらない、というのであればセルかDataGridView側から編集コントロールにアクセスしにくるはずなんだけどなぁ・・・。

前のフォームを利用したサブエディタの場合は、逆に編集コントロールからセルに値を更新していたんだよな。んー、よくわからない。

2007年7月13日金曜日

DataGridViewCellのValue

サブエディタ実装途中にわからなくなったのがコレ。「セルの値(Valueプロパティ)はどのタイミングでセットするのが適切なのか?」というところ。

サブエディタ以外についてはあまり意識しなくともできていたのでよかったんだけど、サブエディタの場合どうもこのあたりのタイミングが掴みにくい。思ったタイミングでは発生していない、ってのはわかったんだけど・・・。

DataGridViewのCommitEdit(EndEditも?)が発生したタイミングで設定にいってるっぽいんだけど・・・?

2007年7月7日土曜日

IDataGridViewEditingControlを使う その2

隠れて進めているちゃんとしたDataGridViewのサブエディタ。現時点では、サブエディタの表示からキー制御などの引継など基本的なところは大体実装済み。

ただこの「表示」ってのが問題になっていて。ああそうか、という内容なんだけど「親であるDataGridViewを超えて編集コントロールを描写はしてくれない」ってところ。なので表示しようとするサブエディタによってはとぎれるんだよねぇ。

コンテナとその子供の描写についてはまだあまり調べきっていないので、このあたりを見ていけばどうにかなる・・・のかな?

でも親コンテナを超えて描写される子供コントロールって見たことないからな。いがいとそのままじゃどうしようもないかもしれないね。

2007年7月1日日曜日

右クリック その2

前にちょっとだけ設計を行っていた右クリック周り。

先週中に一段落つけてはみたんだけど、意外に手間取ったなぁ。つかContextMenuStripのClickイベントではなんでsenderに「現在Activeなコントロール」のインスタンスが設定されてきているんだろう?

これが必要になるケースってのがよく思いつかないんだよねぇ。「特定のコントロールにフォーカスがある際にのみ、コンテキストメニューを表示する」なんて処理が、自分が思うよりもたくさん使うケースがあるってことなのか、それとも全然意味合いからして違うのか・・・。

人様のAPやらソースやらもっと色々みないといけないな、これは。全然思いつかない。