WinForm下的TreeView拖拽操作

http://www.cnblogs.com/zfqbt/archive/2009/12/17/1626582.html


//开始拖动操作事件
       private  void  TreeView_ItemDrag( object  sender, ItemDragEventArgs e)
       {
           TreeNode tn = e.Item as  TreeNode;
           if  ((e.Button == MouseButtons.Left) && (tn != null ) && (tn.Parent != null )) //根节点不允许拖放操作。
           {
               this .treeView.DoDragDrop(tn, DragDropEffects.Copy | DragDropEffects.Move | DragDropEffects.Link);
           }
 
       }
 
       //是否允许拖放操作继续检查事件
       private  void  TreeView_QueryContinueDrag( object  sender, QueryContinueDragEventArgs e)
       {
           //例如,当光标悬停在 TreeView 控件上时,展开该控件中的 TreeNode
           //this.textBox1.Text = p.ToString();
       }
 
       private  void  TreeView_DragEnter( object  sender, DragEventArgs e)
       {
           //e.Effect = e.AllowedEffect;
 
       }
 
       private  void  TreeView_DragOver( object  sender, DragEventArgs e)
       {
           //当光标悬停在 TreeView 控件上时,展开该控件中的 TreeNode
           Point p = this .treeView.PointToClient(Control.MousePosition);
           TreeNode tn = this .treeView.GetNodeAt(p);
           if  (tn != null )
           {
               if  ( this .dragDropTreeNode != tn) //移动到新的节点
               {
                   if  (tn.Nodes.Count > 0 && tn.IsExpanded == false )
                   {
                       this .startTime = DateTime.Now; //设置新的起始时间
                   }
               }
               else
               {
                   if  (tn.Nodes.Count > 0 && tn.IsExpanded == false  && this .startTime != DateTime.MinValue)
                   {
                       TimeSpan ts = DateTime.Now - this .startTime;
                       if  (ts.TotalMilliseconds >= 1000) //一秒
                       {
                           tn.Expand();
                           this .startTime = DateTime.MinValue;
                       }
                   }
               }
 
           }
           //设置拖放标签Effect状态
           if  (tn != null  ) //&& (tn != this.treeView.SelectedNode)) //当控件移动到空白处时,设置不可用。
           {
               if  ((e.AllowedEffect & DragDropEffects.Move) != 0)
               {
                   e.Effect = DragDropEffects.Move;
               }
               if  (((e.AllowedEffect & DragDropEffects.Copy) != 0) && ((e.KeyState & 0x08) != 0)) //Ctrl key
               {
                   e.Effect = DragDropEffects.Copy;
               }
               if  (((e.AllowedEffect & DragDropEffects.Link) != 0) && ((e.KeyState & 0x08) != 0) && ((e.KeyState & 0x04) != 0)) //Ctrl key + Shift key
               {
                   e.Effect = DragDropEffects.Link;
               }
               if  (e.Data.GetDataPresent( typeof (TreeNode))) //拖动的是TreeNode
               {
                    
                   TreeNode parND = tn; //判断是否拖到了子项
                   bool  isChildNode = false ;
                   while  (parND.Parent != null  )
                   {
                       parND = parND.Parent;
                       if (parND == this .treeView.SelectedNode)
                       {
                           isChildNode = true ;
                           break ;
                       }
                   }
                   if  (isChildNode) 
                   {
                       e.Effect = DragDropEffects.None;
                   }
               }
               else  if  (e.Data.GetDataPresent( typeof (ListViewItem))) //拖动的是ListViewItem
               {
                   if  (tn.Parent == null
                   {
                       e.Effect = DragDropEffects.None;
                   }
               }
           }
           else
           {
               e.Effect = DragDropEffects.None;
           }
 
           //设置拖放目标TreeNode的背景色
           if  (e.Effect == DragDropEffects.None)
           {
               if  ( this .dragDropTreeNode != null ) //取消被放置的节点高亮显示
               {
                   this .dragDropTreeNode.BackColor = SystemColors.Window;
                   this .dragDropTreeNode.ForeColor = SystemColors.WindowText;
                   this .dragDropTreeNode = null ;
               }
           }
           else
           {
               if  (tn != null )
               {
                   if  ( this .dragDropTreeNode != null )
                   {
                       if  ( this .dragDropTreeNode != tn)
                       {
                           this .dragDropTreeNode.BackColor = SystemColors.Window; //取消上一个被放置的节点高亮显示
                           this .dragDropTreeNode.ForeColor = SystemColors.WindowText;
                           this .dragDropTreeNode = tn; //设置为新的节点
                           this .dragDropTreeNode.BackColor = SystemColors.Highlight;
                           this .dragDropTreeNode.ForeColor = SystemColors.HighlightText;
                       }
                   }
                   else
                   {
                       this .dragDropTreeNode = tn; //设置为新的节点
                       this .dragDropTreeNode.BackColor = SystemColors.Highlight;
                       this .dragDropTreeNode.ForeColor = SystemColors.HighlightText;
                   }
               }
           }
       }
 
//随着鼠标的移动显示不同的光标效果
       private  void  TreeView_GiveFeedback( object  sender, GiveFeedbackEventArgs e)
       {
           //e.UseDefaultCursors = true;
            
           // Use custom cursors if the check box is checked.
           //if (UseCustomCursorsCheck.Checked)
           //{
           //int i = 0;
           // Sets the custom cursor based upon the effect.
           //e.UseDefaultCursors = false;
           if  ((e.Effect & DragDropEffects.Move) == DragDropEffects.Move)
           {
 
               //Cursor d = new Cursor("");
               //Cursor.Current = MyNormalCursor;
           }
           else
           {
               //Cursor.Current = MyNoDropCursor;
           }
           //}
 
       }
 
       private  void  TreeView_DragDrop( object  sender, DragEventArgs e)
       {
           if  ( this .dragDropTreeNode != null )
           {
               if  (e.Data.GetDataPresent( typeof (TreeNode)))
               {
                    
                   TreeNode tn = (TreeNode)e.Data.GetData( typeof (TreeNode));
                   tn.Remove(); //从原父节点移除被拖得节点
                   this .dragDropTreeNode.Nodes.Add(tn); //添加被拖得节点到新节点下面
                   Category category = (Category)tn.Tag;
                   if  ( this .dragDropTreeNode.Parent == null )
                   {
                       category.ParentID = 0;
                   }
                   else
                   {
                       category.ParentID = ((Category) this .dragDropTreeNode.Tag).CategoryID; 
                   }
                   //更新节点移动到数据库
                   DocumentController.GetInstance().UpdateCategoryParent(category);
                   if  ( this .dragDropTreeNode.IsExpanded == false )
                   {
                       this .dragDropTreeNode.Expand(); //展开节点
                   }
 
               }
               else  if  (e.Data.GetDataPresent( typeof (ListViewItem))) 
               {
                   if  ( this .dragDropTreeNode.Parent != null )
                   {
                       int  categoryID = ((Category) this .dragDropTreeNode.Tag).CategoryID;
                       ListViewItem listViewItem = (ListViewItem)e.Data.GetData( typeof (ListViewItem));
                       Item item = (Item)listViewItem.Tag;
                       DocumentController.GetInstance().UpdateItemCategory(item.ItemID, categoryID);
                       listViewItem.Remove();
                   }                    
               }
               //取消被放置的节点高亮显示
               this .dragDropTreeNode.BackColor = SystemColors.Window;
               this .dragDropTreeNode.ForeColor = SystemColors.WindowText;
               this .dragDropTreeNode = null ;
           }
       }
 
       private  void  TreeView_DragLeave( object  sender, EventArgs e)
       {
           if  ( this .dragDropTreeNode != null ) //在按下{ESC},取消被放置的节点高亮显示
           {
               this .dragDropTreeNode.BackColor = SystemColors.Window;
               this .dragDropTreeNode.ForeColor = SystemColors.WindowText;
               this .dragDropTreeNode = null ;
           }
       }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值