@IT会議室は、2009年4月15日に新システムに移行し、さらに2012年5月29日にITエンジニアに特化した
質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用くださいませ。
- PR -

[VB.NET]TreeViewのドラッグ&ドロップについて

1
投稿者投稿内容
ゆき
大ベテラン
会議室デビュー日: 2003/11/02
投稿数: 121
投稿日時: 2005-08-30 10:07
おはようございます。
アプリケーション間(同一のアプリケーションを重複起動)でTreeViewのノードをドラッグ&ドロップしたいのですが、どうもうまくいきません。
コードは、こんな感じです。(たぶん改行がうまく表示されずに見づらくなっていると思いますが、ご容赦を)

Private Sub TreeView1_ItemDrag(ByVal sender As Object, ByVal e As         System.Windows.Forms.ItemDragEventArgs) Handles TreeView1.ItemDrag

    m_dragNode = Nothing
If Control.ModifierKeys <> Keys.Control Then
      m_dragNode = CType(e.Item, TreeNode).Tag
DoDragDrop(e.Item, DragDropEffects.Move)
Else
DoDragDrop(e.Item, DragDropEffects.Copy)
End If
End Sub

Private Sub TreeView1_DragEnter(ByVal sender As Object, ByVal e As         System.Windows.Forms.DragEventArgs) Handles TreeView1.DragEnter
If Not IsNothing(m_dragNode) Then
e.Effect = DragDropEffects.Move
Else
e.Effect = DragDropEffects.Copy
End If
End Sub

Private Sub TreeView1_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TreeView1.DragOver
DragDropCheck(sender, e)
End Sub

Private Sub TreeView1_DragDrop(ByVal sender As Object, ByVal e As         System.Windows.Forms.DragEventArgs) Handles TreeView1.DragDrop
If Not IsNothing(m_dragNode) Then
'移動
DragDropMove(sender, e)
Else
'コピー
DragDropCopy(sender, e)
End If
End Sub

Private Function DragDropCheck(ByVal sender As Object, ByVal e As DragEventArgs) As Boolean

If e.Data.GetDataPresent("System.Windows.Forms.TreeNode", False) Then

Dim stPoint As Point
Dim objTargetNode As TreeNode

stPoint = CType(sender, TreeView).PointToClient(New Point(e.X, e.Y))
objTargetNode = CType(sender, TreeView).GetNodeAt(stPoint)

If Not IsNothing(m_dragNode) Then
Select Case Type(e.Data.GetData("System.Windows.Forms.TreeNode"),         TreeNode).Tag.GetType.ToString.Substring
(CType(e.Data.GetData("System.Windows.Forms.TreeNode"),     TreeNode).Tag.GetType.ToString.LastIndexOf(".") + 1)

Case
省略
End Select
Else
省略
End If
End If
End Sub

Private Sub DragDropMove(ByVal sender As Object, ByVal e As DragEventArgs)
'ドラッグムーブ
省略
End Sub

Private Sub DragDropCopy(ByVal sender As Object, ByVal e As DragEventArgs)
'ドラッグコピー
省略
End Sub

単一のアプリケーション内でやっている場合は問題ないのですが、アプリケーション間ではうまくいきません。TreeNodeのTagにオブジェクトが入っていて、このオブジェクトをドラッグ&ドロップで移動やコピー(アプリケーション間の場合はコピーのみ)したいのですが、アプリケーション間ではこのTagの中身が参照できないようなのです。
DragDropCheckというFunctionで e.Effectを変更して、カーソルの表示を変えようとしているのですが、Tagの中身までは参照できないようで、カーソルが常に駐車禁止みたいなマークになってしまいます。
DoDragDropの引数にTagを入れても、クリップボードにTag内のオブジェクトを入れて、TreeView1_DragOverでクリップボードの中身を判定し、e.Effectを変更しようとしても、
やっぱりカーソルは変わりませんでした。
MSDNの、
http://www.microsoft.com/japan/msdn/net/upgrade/dragndropops.asp
を参考にもしたのですが、これもダメでした。
どなたかご存知の方がおりましたら、どうか御教授を。




1

アイティメディアの提供サービス

ホワイトペーパー(TechTargetジャパン/閲覧には会員登録が必要です)

スキルアップ/キャリアアップ(JOB@IT)