DataGridView セルにマウスだけで編集モード 全然だめ

http://silent-diary.at.webry.info/201501/article_5.html

セルにマウスが入るだけでそのセルを編集モードにする。解決したと思った。CellMouseEnterイベントでCurrentCellを設定し、BeginEditという流れで。しかし、別のところで問題が出て使いものにならない。

DataGridViewにたくさんデータを追加し、縦にスクロールする状態になったとき、DataGridViewの下端の半端に表示されている行にマウスを持っていく。すると先の方法でCurrentCellにマウスを持っていったセルが設定される。この時、CurrentCellに設定されたセルが完全に表示されるために自動でスクロールする。すると、マウスは動かしてないけどリストが勝手に動くので別のセルを指すことになる。すると、そこでまたCellMouseEnterイベントが発生し、CurrentCellが設定され、またスクロールする。これがリストの残りの行全てに繰り返し発生し、結果的に一番下の行まで勝手にスクロールしてしまう。だめ。

もう一つ。ある行を選択し、DataGridViewの外に配置しているコマンドボタンをクリックして印刷とか別の処理をしたい。で、例えば1行目を選択して、マウスをそのコマンドボタンまで移動するとき、先述のセルの上を通過したとする。この時、CurrentCellが通過する行のセルに設定されるため、先に選択した行と別の行が選択状態になる。なので、ユーザーコントロールを表示しているセルをさけてマウスをボタンまで持っていかないといけない。ありえない。

だめだー。このやり方では。

標準で用意されてるDataGridViewButtonCellは、カレントセルにしなくてもボタンが押せる。何が違うのか?そのソースを眺めてみて、なんとなくわかった。

マウスがボタンセルの上に来た時とか、マウスをクリックした時それに対応するイベント(OnMouseMoveとかOnMouseUp)をオーバーライドしてて、それに応じたボタンの画像を作って表示している。クリック時はOnKeyUpでRaiseCellContentClickによりCellContentClickイベントを起こしている。CurrentCell使ってない。だから、変な動きしない。まるで編集モードになってるかのように描画しているだけなのだ。と思う。多分。

じゃあ、それにならえばいいじゃないか!!

とはいかない。俺のスキルでは。標準のボタンセルはセルいっぱいにボタンが表示されてるのでわかりやすい。しかし、俺が使いたいユーザーコントロールはセルの一部分だけがボタン。その上に来た時だけボタンがクリックできるような絵を描画し、クリックに対応しないといけない。どうやってそんなの検出する?最悪描画はしなくていいか。クリックさえできれば。あ、でもクリックした時の絵は描画しないといけないか。一体どうすれば・・・。