DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DoubleClickで、条件を満たすときだけCurrentCellを変更したい

環境/言語:[Vista, VS2005, C#]
分類:[.NET]

DataGridViewで次のような事をしたいのですが、可能でしょうか。
1)ClickをしてもCurrentCellを変えない
2)DoubleClickをしたとき、条件判定をして、条件が満たされればCurrentCellを変更する

これまでFlexGridというMicrosoft以外のグリッドを使って上記のことが実現していました。FlexGridにBeforeSelectionChangeというイベントがあるので、それを使って別記のようにしたのです。GridをFlexGridからDataGridViewに変更しようとしたところ、DataGridViewにはBeforeSelectionChangeというイベントがなく、FlexGridと同じ事が実現できません。
●DataGridViewでSelectionChangeの前にBeforeSelectionChangeというイベントを発生させ、そのハンドラーでSelectionChangeをキャンセルできるようにすることは可能でしょうか。
●DataGridViewで、もっと別の方法で、上記1、2を実現することは可能でしょうか。


【別記:FlexGridでの上記機能の実現方法】
1)CurrentCellを設定し、cancelAtBeforeSelectionChange=trueというフラッグを設定する。
2)FlexGridにはBeforeSelectionChangeというイベントが定義されている。ここで、cancelAtBeforeSelectionChange=trueならSelectionの変更をキャンセルする。このときSelectionの変更先をnewRow, newColumnとして記録する。cancelAtBeforeSelectionChange=falseならばSelectionの変更はキャンセルしないで実行されることを許す、ただしここでcancelAtBeforeSelectionChange=trueに再設定する
3)DoubleClickイベントハンドラーで、条件判定をし、条件が満たされれば、cancelAtBeforeSelectionChange=falseにして、CurrentCellを2)で保存したnewRow, newColumnに再定義する。条件が満たされなければCurrentCelは変更せず, cancelAtBeforeSelectionChangeもtrueのまま。
4)上記3)でCurrentCellを変更したとき、SelectionChangeイベントが発生するのでそのイベントハンドラーでcancelAtBeforeSelectionChange=trueに変更する。
お疲れ様です

短時間で書いた手抜きなコードですが、
試してみてください

P.S.
クリックしようとしたセルは、DataGridView.HitTestメソッドで取得できます

Public Class DataGridViewEx
    Inherits DataGridView

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_.WM_LBUTTONDOWN, WM_.WM_RBUTTONDOWN
                Return
            Case WM_.WM_LBUTTONDBLCLK, WM_.WM_RBUTTONDBLCLK
                If Me._条件を満たせばTrue = False Then
                    Return
                End If
        End Select

        MyBase.WndProc(m)
    End Sub

    Private Enum WM_
        WM_LBUTTONDOWN = &H201
        WM_LBUTTONUP = &H202
        WM_LBUTTONDBLCLK = &H203
        WM_RBUTTONDOWN = &H204
        WM_RBUTTONUP = &H205
        WM_RBUTTONDBLCLK = &H206
        WM_MBUTTONDOWN = &H207
        WM_MBUTTONUP = &H208
        WM_MBUTTONDBLCLK = &H209
    End Enum

    Private Function _条件を満たせばTrue() As Boolean
        Return True
    End Function

End Class
2009/08/25(Tue) 14:05:41 編集(投稿者)
2009/08/25(Tue) 14:05:14 編集(投稿者)
2009/08/25(Tue) 14:04:55 編集(投稿者)

■No25283に返信(H.K.R.さんの記事)
短時間で書いた手抜きなコードですが、
> 試してみてください

H.K.R.さん、有難う御座いました。

とても簡単に、すなおなコードで、期待通りの結果が得られました。WndProcというメソッドは、昔Cを勉強したときにちょっとだけかじって、とても難しそうで敬遠していたのですが、今回、このように指導いただき、具体的に問題を解決できることを体験できました。また、これをもっと勉強し、使い慣れるべきだという事を実感しました。

これで、前回教えていただいたDataGridViewTextBoxEditingControlの問題とあわせて、いま構想中のアプリの中核となる部分を完成できそうです。

ありがとうございました。今後ともよろしくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板