分享

WinForm下的TreeView拖拽操作

 长江黄鹤 2023-09-22
//开始拖动操作事件
      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;
          }
      

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约