
ドラッグ&ドロップでつまずいた。
解決したので、備忘録として残しておく。
要点は、イベントによって EventArg で受け取る中身が同じではないこと。
今回はドラッグ元・ドロップ先がどちらも DataGridView だったケース。
ドラッグ&ドロップで利用する MouseDown や MouseMove イベントでは、
HitTest で DataGridView の行・列を取得できる。
が、DragDrop イベントの場合は、
直接 HitTest で行・列番号(RowIndex, ColumnIndex)が取得できない。
理由は「DragEventArgs の X プロパティおよび Y プロパティは、クライアント座標ではなく、画面座標の値」であるため。
(MSDN:Control.DragDrop イベント)
なので、いったん画面座標をクライアント座標に変換してから、
HitTest で DataGridView の行・列番号を取得する必要がある。
ま、長々しい説明はここまでとし、ソースコードを残しておく。
下は、dgvFrom からドラッグされた画像を dgvTo にドロップするときの DragDrop イベント。
-----------------------------
Private Sub dgvTo_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles dgvTo.DragDrop
' --- ① dgvTo でドロップされた画面座標を取得、② 画面座標をクライアント座標(dgvTo の行列番号)に
Dim clientPoint As Point = Me.dgvTo.PointToClient(New Point(e.X, e.Y)) ' -- ①
Dim hit As DataGridView.HitTestInfo = Me.dgvTo.HitTest(clientPoint.X, clientPoint.Y)' -- ②
' --- dgvFrom の画像を dgvTo に格納(mouseDownRow は dgvFrom でドラッグされた行番号)
If Me.mouseDownRow >= 0 _
AndAlso hit.RowIndex >= 0 AndAlso hit.ColumnIndex >= 0 Then
Me.dgvTo(hit.ColumnIndex, hit.RowIndex).Value = _
Me.dgvFrom(1, Me.mouseDownRow).Value ' -- dgvFrom では 列 1に画像を収めている
End If
End Sub
-----------------------------
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・

ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・
解決したので、備忘録として残しておく。
要点は、イベントによって EventArg で受け取る中身が同じではないこと。
今回はドラッグ元・ドロップ先がどちらも DataGridView だったケース。
ドラッグ&ドロップで利用する MouseDown や MouseMove イベントでは、
HitTest で DataGridView の行・列を取得できる。
が、DragDrop イベントの場合は、
直接 HitTest で行・列番号(RowIndex, ColumnIndex)が取得できない。
理由は「DragEventArgs の X プロパティおよび Y プロパティは、クライアント座標ではなく、画面座標の値」であるため。
(MSDN:Control.DragDrop イベント)
なので、いったん画面座標をクライアント座標に変換してから、
HitTest で DataGridView の行・列番号を取得する必要がある。
ま、長々しい説明はここまでとし、ソースコードを残しておく。
下は、dgvFrom からドラッグされた画像を dgvTo にドロップするときの DragDrop イベント。
-----------------------------
Private Sub dgvTo_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) Handles dgvTo.DragDrop
' --- ① dgvTo でドロップされた画面座標を取得、② 画面座標をクライアント座標(dgvTo の行列番号)に
Dim clientPoint As Point = Me.dgvTo.PointToClient(New Point(e.X, e.Y)) ' -- ①
Dim hit As DataGridView.HitTestInfo = Me.dgvTo.HitTest(clientPoint.X, clientPoint.Y)' -- ②
' --- dgvFrom の画像を dgvTo に格納(mouseDownRow は dgvFrom でドラッグされた行番号)
If Me.mouseDownRow >= 0 _
AndAlso hit.RowIndex >= 0 AndAlso hit.ColumnIndex >= 0 Then
Me.dgvTo(hit.ColumnIndex, hit.RowIndex).Value = _
Me.dgvFrom(1, Me.mouseDownRow).Value ' -- dgvFrom では 列 1に画像を収めている
End If
End Sub
-----------------------------
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・

ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・
![]() | Microsoft Visual Studio Professional 2013 通常版 |
マイクロソフト |
![]() | Microsoft Visual Studio Professional 2013 アップグレード版 |
マイクロソフト |