DataGridViewのCheckBoxColumnのCheckChangeを捉える
- 題名: DataGridViewのCheckBoxColumnのCheckChangeを捉える
- 著者: kane123
- 日時: 2012/11/15 11:22:43
- ID: 31113
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: DataGridViewのCheckBoxColumnのCheckChangeを捉える
- 著者: kane123
- URL: http://Windows7 VB.net
- 日時: 2012/11/15 11:25:59
- ID: 31114
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: DataGridViewのCheckBoxColumnのCheckChangeを捉える
- 著者: GOD
- 日時: 2012/11/15 15:43:12
- ID: 31115
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: DataGridViewのCheckBoxColumnのCheckChangeを捉える
- 著者: kane123
- URL: http://Windows7 VB.net
- 日時: 2012/11/15 16:08:12
- ID: 31116
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: DataGridViewのCheckBoxColumnのCheckChangeを捉える
- 著者: kane123
- URL: http://Windows7 VB.net
- 日時: 2012/11/16 9:29:04
- ID: 31118
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: DataGridViewのCheckBoxColumnのCheckChangeを捉える
- 著者: kane123
- URL: http://Windows7 VB.net
- 日時: 2012/11/16 10:05:47
- ID: 31119
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[6]: DataGridViewのCheckBoxColumnのCheckChangeを捉える
- 著者: kane123
- URL: http://Windows7 VB.net
- 日時: 2012/11/16 10:07:23
- ID: 31120
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[6]: DataGridViewのCheckBoxColumnのCheckChangeを捉える
- 著者: GOD
- 日時: 2012/11/16 13:18:35
- ID: 31123
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
DataGridViewのCheckBoxColumnのCheck状態が「変わった」というイベントが、
マウスのアップ時に、EndEditイベントなどによってタイムリーに拾えない
現象について解決を探してます。
具体的に言うと、CheckBoxの場合、EndEditイベントはマウスのアップ時に
ではなく、そのセルからフォーカスが他のセルに移った時に初めて起こる
ので、セル上にチェックマークが描かれた瞬間のイベント発生とはならない
のです。
これを解決するために、他のイベント(ValueChangedや、EditingControlShowing
)の活用を検討しましたが、どれもうまく行きませんでした。
最終的には以下のような自作クラスによってしか解決しないという結論に
達したのですが、どうも他にもっと良い方法がないものかと気になっています。
もし何かあればご教授頂ければ幸いです。
Public Class MyDgv
'※DataGridView上にCheckBoxColumnは一つしかないという前提での造りです
Inherits DataGridView
Private pri_lastcontentclicked_ind As Integer = -1
Private pri_lastmouseup_ind As Integer = -1
Private Shadows Sub CellContentClick(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles MyBase.CellContentClick
If Not TypeOf (MyBase.Columns(e.ColumnIndex)) Is DataGridViewCheckBoxColumn Then Return
pri_lastcontentclicked_ind = e.RowIndex
End Sub
Private Shadows Sub CellMouseUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) _
Handles MyBase.CellMouseUp
If e.ColumnIndex = -1 Then Return
If Not TypeOf (MyBase.Columns(e.ColumnIndex)) Is DataGridViewCheckBoxColumn Then Return
If pri_lastcontentclicked_ind = -1 Then Return
If pri_lastcontentclicked_ind = e.RowIndex Then
'直前に起こったCellContentClickのindexと、このMouseUpイベントのindexが同じ場合は、
'チェックが変わったとみなす
'CheckChange時に行いたい処理は、他のTextColumnなどのEndEdit時とひとまとめにして、
'EndEditイベントハンドラに集約して書くという考え方をとるので
'ここでEndEditを誘発するのが合理的(と考える)
MyBase.EndEdit()
End If
End Sub
End Class