2014/12/03(Wed) 10:33:51 編集(投稿者)
途中だったのを忘れてたorz
■No74148 (shu さん) に返信
> ■No74145 (優希(ゆき) さん) に返信
>>■No74143 (Hongliang さん) に返信
>>>>データとしてはX,Y座標は取得できていますが、
> >>本当ですか? DragEventArgsのX, Yはスクリーン座標だそうですが。
> >>http://msdn.microsoft.com/ja-jp/library/system.windows.forms.drageventargs.aspx
> >>DataGridViewのPointToClientメソッドでDataGridViewのクライアント座標に変換しないといけないのでは。
>>
>>http://dobon.net/vb/dotnet/datagrid/hittest.html
>>
>>これはDataGridですが、この方法とは違うのでしょうか?
>
> Hongliang さんの指摘は
> DragEventArgsのX,Y つまり
>>Dim hti As DataGridView.HitTestInfo = DirectCast(sender, DataGridView).HitTest(e.X, e.Y)
> ここのe.X,e.YがDataGridView上の座標ではなくWindows上でのマウス位置を表していますということです。
> なので該当画面の位置、DataGridViewの該当画面上の位置分だけずれてしまいます。
>
> Dim dgv = DirectCast(sender, DataGridView)
> Dim dragpt as new Point(e.X,e.Y)
> Dim dgvpt = dgv.PointToClient(dragpt)
>
> のような感じで座標変換する必要がるということです。なお上記コードは動作確認はしておりません。
>
>
shuさんとHongliangの回答を確認して、座標を変換してHitTestで処理した所、うまくD&Dすることが出来ました。
shuさん,ヴァンさん,Hongliang さん
ありがとうございます。
下に、コードを載せておきます(変数は気にしないでください)
''スクリーン座標を変数へ入れる
Dim target As New Point(e.X, e.Y)
''スクリーン座標をクライアント座標へ変換
Dim a = dgvname.PointToClient(target)
'座標をDataGridViewのHitTestInfoへ入れる
Dim bbb As DataGridView.HitTestInfo = dgvname.HitTest(a.X, a.Y)
'ここでドロップしたデータをセルへ入れる
dgvname(bbb.ColumnIndex, bbb.RowIndex).Value = dgvcellvalue
(英語サイトをスルーしてたけど、C#でまんま答えが載ってた…orz)
http://stackoverflow.com/questions/1835329/how-to-target-a-datagridview-row-or-cell-from-dragdrop-event