掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB.NET-ツリービュー上でのドラッグANDドロップでDropHighlightしたい。 (ID:109630)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
VB.NETでツリービュー上でドラッグアンドドロップできる処理を作成しているのですが。 1)ドラッグ中にエクスプローラのように、ツリーをスクロールをしたい。 2)ドラッグ中にエクスプローラのように、もし、ツリーにサブツリーがある場合には、展開をしたい。 3)ドラッグ中にエクスプローラのように、どこにドラッグされるか、 ハイライト表示(VB6.0のころは、DropHighlightメソッドでできた?)又は、 ドラッグツリー名の表示をしたい。 > 1)...ツリーをスクロールをしたい。 TreeNodeのPrevVisibleNode, NextVisibleNodeに対してEnsureVisible > 2)...ツリーにサブツリーがある場合には、展開をしたい。 TreeNodeのExpand > 3)...どこにドラッグされるかハイライト表示 > ...又は、ドラッグツリー名の表示をしたい。 ドラッグ先をTreeView1.GetNodeAt()で取得してBackColor等を設定 ドラッグツリー名はTreeNodeのFullPathで取得 でいけると思いますが「エクスプローラのように」となると delayタイムを設けないと快適な操作感は得られないので、 ちょっとゴチャゴチャしそうですね。この辺りの実装方法は いろいろあるかと思いますが、一例としてこんな感じ。 (あまり検証していないので不具合ある可能性大(^^;) Private m_nodeDrag As TreeNode = Nothing Private m_nodeHighlight As TreeNode = Nothing Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load TreeView1.AllowDrop = True 'キリよくサイズ調整 TreeView1.Height = TreeView1.VisibleCount() * TreeView1.ItemHeight() + 4 End Sub 'Dragの開始 Private Sub TreeView1_ItemDrag(ByVal sender As Object, _ ByVal e As System.Windows.Forms.ItemDragEventArgs _ ) Handles TreeView1.ItemDrag m_nodeHighlight = Nothing m_nodeDrag = CType(e.Item, TreeNode) m_nodeDrag.BackColor = Color.LightGray TreeView1.SelectedNode = Nothing TreeView1.DoDragDrop(m_nodeDrag, DragDropEffects.Move) End Sub 'Dragさまよい中 Private Sub TreeView1_DragOver(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs _ ) Handles TreeView1.DragOver Static s_hoverStartTime As DateTime = DateTime.Now If e.Data.GetDataPresent("System.Windows.Forms.TreeNode") Then Dim nodeHover As TreeNode = _ TreeView1.GetNodeAt(TreeView1.PointToClient(New Point(e.X, e.Y))) Dim timeHover As Integer = _ CInt(DateTime.Now.Subtract(s_hoverStartTime).TotalMilliseconds) If timeHover >= 800 Then 'delay800msで、自動展開 nodeHover.Expand() s_hoverStartTime = DateTime.Now ElseIf timeHover >= 300 Then 'delay300msで、自動Scroll If Not nodeHover.PrevVisibleNode Is Nothing AndAlso Not nodeHover.PrevVisibleNode.IsVisible Then nodeHover.PrevVisibleNode.EnsureVisible() s_hoverStartTime = DateTime.Now End If If Not nodeHover.NextVisibleNode Is Nothing AndAlso Not nodeHover.NextVisibleNode.IsVisible Then nodeHover.NextVisibleNode.EnsureVisible() s_hoverStartTime = DateTime.Now End If End If 'Dropターゲットの着色とカーソル状態設定 If nodeHover Is m_nodeHighlight Then e.Effect = DragDropEffects.Move Me.Text = nodeHover.FullPath Else '(!)Drag元の配下へDropできないようにするとかは、このSampleでは考慮していない If Not m_nodeHighlight Is Nothing Then m_nodeHighlight.BackColor = TreeView1.BackColor m_nodeHighlight.ForeColor = TreeView1.ForeColor End If If nodeHover Is m_nodeDrag Then e.Effect = DragDropEffects.None Else nodeHover.BackColor = SystemColors.Highlight nodeHover.ForeColor = SystemColors.HighlightText m_nodeHighlight = nodeHover s_hoverStartTime = DateTime.Now e.Effect = DragDropEffects.Move End If End If End If End Sub 'Drop発生 Private Sub TreeView1_DragDrop(ByVal sender As Object, _ ByVal e As System.Windows.Forms.DragEventArgs _ ) Handles TreeView1.DragDrop 'TODO:Dropの処理を記述 End Sub 'D&Dの完了or中断 Private Sub TreeView1_MouseUp(ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs _ ) Handles TreeView1.MouseUp If Not m_nodeHighlight Is Nothing Then m_nodeHighlight.BackColor = TreeView1.BackColor m_nodeHighlight.ForeColor = TreeView1.ForeColor m_nodeHighlight = Nothing End If If Not m_nodeDrag Is Nothing Then m_nodeDrag.BackColor = TreeView1.BackColor m_nodeDrag = Nothing End If End Sub <参考URL> ▼Windows フォームにおけるドラッグ アンド ドロップ操作の実行 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbtskstartingdragoperations.asp ▼宇宙仮面のC# プログラミングへようこそ! ドラッグアンドドロップ http://ukamen.hp.infoseek.co.jp/Programming1/DragAndDrop/
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.