goo blog サービス終了のお知らせ 

北の窓から(芦田っち)

PC関連と私的雑感のブログ。
2015年7月10日、カッコ内に名前を加えました。昔の友だちに気付いてほしくて・・・

【VB.NET】Drag&Drop の留意点・・・ DragDrop イベント

2014-11-21 09:27:42 | 北窓舎
ドラッグ&ドロップでつまずいた。
解決したので、備忘録として残しておく。

要点は、イベントによって 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 アップグレード版
マイクロソフト

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Nexus 7 (2013) 奮闘記 -67- ... | トップ | 700 MB を超える Windows 8.1... »
最新の画像もっと見る

コメントを投稿

サービス終了に伴い、10月1日にコメント投稿機能を終了させていただく予定です。
ブログ作成者から承認されるまでコメントは反映されません。

北窓舎」カテゴリの最新記事