サブエディタ実装途中にわからなくなったのがコレ。「セルの値(Valueプロパティ)はどのタイミングでセットするのが適切なのか?」というところ。
サブエディタ以外についてはあまり意識しなくともできていたのでよかったんだけど、サブエディタの場合どうもこのあたりのタイミングが掴みにくい。思ったタイミングでは発生していない、ってのはわかったんだけど・・・。
DataGridViewのCommitEdit(EndEditも?)が発生したタイミングで設定にいってるっぽいんだけど・・・?
DataGridView や DataRepeater にこだわりつつ
時代は Workflow Foundation などと言い続けていたら
これからは LogicFlow だろ! と思い始めてきた
色々浅く広くやっていく古い技術者の Blog
サブエディタ実装途中にわからなくなったのがコレ。「セルの値(Valueプロパティ)はどのタイミングでセットするのが適切なのか?」というところ。
サブエディタ以外についてはあまり意識しなくともできていたのでよかったんだけど、サブエディタの場合どうもこのあたりのタイミングが掴みにくい。思ったタイミングでは発生していない、ってのはわかったんだけど・・・。
DataGridViewのCommitEdit(EndEditも?)が発生したタイミングで設定にいってるっぽいんだけど・・・?
隠れて進めているちゃんとしたDataGridViewのサブエディタ。現時点では、サブエディタの表示からキー制御などの引継など基本的なところは大体実装済み。
ただこの「表示」ってのが問題になっていて。ああそうか、という内容なんだけど「親であるDataGridViewを超えて編集コントロールを描写はしてくれない」ってところ。なので表示しようとするサブエディタによってはとぎれるんだよねぇ。
コンテナとその子供の描写についてはまだあまり調べきっていないので、このあたりを見ていけばどうにかなる・・・のかな?
でも親コンテナを超えて描写される子供コントロールって見たことないからな。いがいとそのままじゃどうしようもないかもしれないね。
前にちょっとだけ設計を行っていた右クリック周り。
先週中に一段落つけてはみたんだけど、意外に手間取ったなぁ。つかContextMenuStripのClickイベントではなんでsenderに「現在Activeなコントロール」のインスタンスが設定されてきているんだろう?
これが必要になるケースってのがよく思いつかないんだよねぇ。「特定のコントロールにフォーカスがある際にのみ、コンテキストメニューを表示する」なんて処理が、自分が思うよりもたくさん使うケースがあるってことなのか、それとも全然意味合いからして違うのか・・・。
人様のAPやらソースやらもっと色々みないといけないな、これは。全然思いつかない。
とりあえず一段落した右クリック周り。共通制御に組み込む、ってところが色々と悩んだけどとりあえずはそれなりな形でリリースできたと思う。プロパティの設定やイベントの発生周りについては、特に意識することなく制御されるから。
問題になったのは「対象データってどれ?」という話題。
グリッド系コントロールだとHitTest使って対象行特定できるな~、と漠然に考えていたら・・・できるわけねぇんだ、これがw
メニューを表示してクリックする → マウスカーソルが移動する
メニュークリック時の座標使ってもどうしようもない、というか関連がないw
これを解決するとなると・・・メニューを表示する直前に座標を保持する、ってとこなんだろうなぁ・・・。隠れて仕込んでおかないと。
なんじゃこりゃw
Clickイベント発生の際に渡されてくるsenderって「発生元コントロール」でなくて「その時アクティブだったコントロール」だったのか!どうりで変なコントロールがイベントに飛んでくるはずだ・・・(´・ω・`)
TreeGridViewを用意したはいいけれど、VisualStyleを利用していない環境では思いっきり例外投げてしまうのが発覚。例外見て、「そりゃそうだわなぁ」なんて思える内容なんだけど、実際にはちょっと困ったことが。
VisualStyleを適用している際に表示するモノってのはSystem.Windows.Forms.VisualStyles.VisualStyleElementからたどっていってレンダリングできるんだよな。ところが適用していない場合に表示するモノってのが見つからない。個人的には適用していてもしてなくても同じロジックで取れるとありがたいんだけど・・・。
高望みか、これは。
今回のお仕事は、出荷状況の都合でOffice2007になることが正式に決定。いやぁ、これでCOMを利用した制御から逃れられるw
となると、課題になるのがOfficeのファイルフォーマットの入手かな?それと、ライブラリのところから2003→2007に変更しないと・・・。
あれ、そういえば2003と2007って同居した時にメソッドの拡張やらが行われるからちと問題があった記憶が・・・。まぁいいか。メソッドたたいてファイル操作すること自体がなくなるんだし・・・。
追記(15:49)
ちくしょう、英語でしかドキュメントが入手できないっ!!
こういうソリューションが無償で提供されているっていうのが、ものすごい脅威なんだよねぇ。なにしろ拡張部分ってのはVisualStudioを利用してWebパーツとして作成できるんだから。実際にweb上でも、SharePointService(またはOfficeSharePointServer2007)を利用して構築されたサイトってのも見受けられるし。
同じようなグループウェアも色々あるけど、拡張性やら何やらを考えると「システム屋に向いている」のはSharePoint系だなぁ、と思う。ユーザー向けなのはサイボウズだとかDeskNetsとかだろうけど。
以前にある程度実用的に用意できたサブエディタだけど、ここ最近色々と問題が発覚。そこで断念していた「ちゃんとしたサブエディタ」の設計と実装を始めることに。
DataGridViewコントロールの仕組みとして、編集コントロールをホストするタイプの物はIDataGridViewEditingControlを継承している必要があるのと、「ホストされるコントロールを継承している」必要があるんだよね。MSDNなどのサンプルも全てそうなっている。でもやりたいこととしては、「AP実装者側で自由にサブエディタのGUIやロジックを記述できるようにする」ということなので、ホストされるコントロールの継承、というのが今回は行えないんだよな。
んじゃあどうしましょ、というところで今考えているのが編集時にイベントやロジックを全て受け継ぐというか、トラップして制御を委任するだとかそういった制御。イベントだけだとまだ問題ないんだよね。イベント管理のコレクションを元にやってあげれば恐らくできそう。コントロールの配置とかも問題ないかな。
ただその割に、うまくいきそうでいかないんだよなぁ。何か見落としているか、間違ってそうな予感が満載。イヤな感じだ・・・。
昨日のTabIndexはなんとかうまくいった。大体想定したとおりに動いてくれたので良かった・・・。
今日出た問題の中にDataGridViewTextBoxCellのWrapMode問題があったなぁ。WrapMode=Trueとしたときだけ例外が発生するという。Reflcterで追っかけてみると、確かにWrapMode=Trueとした場合のロジックで問題がありそうな箇所が発見できた。セルの編集済み書式を取得するメソッドで明示的にStringを返していないといけなかったみたいで・・・。でもこれってWrapModeにTrueを指定したときだけなんだよね。NotSetやFalseをセットした場合は今回みたいな例外は発生しない。
DataGridViewTextBoxCellを継承しているコントロール全てに関連する問題だけど、これは仕様なのかバグなのか微妙だな・・・。なんでセルの値に対してToStringしないでCStrかけているんだろう??