AE 实现节点拖动

此处treeview模拟TOC控件,实现节点拖动,图层变换功能

备注:此处在treeview添加节点,需用"Nodes.Insert(0,A)”,不用"Nodes.Add(A)",因为AE添加图层顺序有关。(A为节点名)

AE默认将新加的图层添加在axMapControl控件最上方,而Nodes.Add默认将节点添加在最下方。

        /// <summary>
        ///  treeView控件ItemDrag事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tvOceanList_ItemDrag(object sender, ItemDragEventArgs e)
        {
            DoDragDrop(e.Item, DragDropEffects.Move);
        }

        /// <summary>
        /// treeView控件DragEnter事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tvLayerList_DragEnter(object sender, DragEventArgs e)
        {
            //获取节点的数据内容
            object MyData = e.Data.GetData(typeof(TreeNode));

            //如果节点有数据,拖放目标允许移动
            if (MyData != null)
            {
                e.Effect = DragDropEffects.Move;
            }
            else
            {
                e.Effect = DragDropEffects.None;
            }
            TreeView MyTreeView = (TreeView)sender;

             //获取拖动的节点
            TreeNode MyNode = MyTreeView.GetNodeAt(tvLayerList.PointToClient(new System.Drawing.Point(e.X, e.Y)));
            if (MyNode != null)
            {
                //改变进入节点的背景色
                MyNode.BackColor = Color.BlueViolet;

                //保存此节点,进入下一个时还原背景色
                MyOldNode = MyNode;
            }
        }

        /// <summary>
        /// 移动节点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tvLayerList_DragDrop(object sender, DragEventArgs e)
        {
            try
            {
                //处理 treeView1控件DragDrop事件 
                TreeNode MyNode = (TreeNode)e.Data.GetData(typeof(TreeNode));
                TreeView MyTreeView = (TreeView)sender;
                //得到当前鼠标进入的节点
                TreeNode MyTargetNode = MyTreeView.GetNodeAt(tvLayerList.PointToClient(new System.Drawing.Point(e.X, e.Y)));
                if (MyTargetNode != null)
                {
                    TreeNode MyTargetParent = MyTargetNode.Parent;

                    if (MyTargetNode.Level == 2)//判断节点层数
                    {
                        if (MyTargetNode.Index < MyNode.Index)//如果是上移图层
                        {
                            //删除拖放的节点
                            MyNode.Remove();
                            //添加到目标节点
                            MyTargetNode.Parent.Nodes.Insert(MyTargetNode.Index, MyNode);
                            MoveLayer(MyNode);
                        }
                        else if (MyTargetNode.Index > MyNode.Index)//如果是下移图层
                        {
                            //删除拖放的节点
                            MyNode.Remove();
                            //添加到目标节点
                            MyTargetNode.Parent.Nodes.Insert(MyTargetNode.Index + 1, MyNode);
                            MoveLayer(MyNode);
                        }
                        else//如果移到本身
                        {
                            MessageBox.Show("不能拖动到此!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    else if (MyTargetNode.Level == 1)//判断节点层数
                    {
                        if (MyTargetNode.Index < MyNode.Index)//如果是上移图层
                        {
                            //删除拖放的节点
                            MyNode.Remove();
                            //添加到目标节点
                            MyTargetNode.Nodes.Insert(MyTargetNode.Index, MyNode);
                        }
                        else if (MyTargetNode.Index > MyNode.Index)//如果是下移图层
                        {
                            //删除拖放的节点
                            MyNode.Remove();
                            //添加到目标节点
                            MyTargetNode.Nodes.Insert(MyTargetNode.Index + 1, MyNode);
                        }
                        else //如果移到本身
                        {
                            MessageBox.Show("不能拖动到此!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                    else//不能移到时间节点
                    {
                        MessageBox.Show("不能拖动到此!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    MyTargetNode.BackColor = Color.White;
                    MyTreeView.SelectedNode = MyTargetNode;
                }
            }
            catch (Exception ex)
            { }

        }

        /// <summary>
        /// 移动节点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tvLayerList_DragOver(object sender, DragEventArgs e)
        {
            //处理 treeView1控件DragOver事件
            //修改鼠标进入节点的背景色,还原上一个节点的背景色
            TreeView MyTreeView = (TreeView)sender;
            TreeNode MyNode = MyTreeView.GetNodeAt(tvLayerList.PointToClient(new System.Drawing.Point(e.X, e.Y)));
            if ((MyNode != null) && (MyNode != MyOldNode))
            {
                MyOldNode.BackColor = Color.White;
                MyNode.BackColor = Color.Blue;
                MyOldNode = MyNode;
            }
        }

        /// <summary>
        /// 移动图层
        /// </summary>
        /// <param name="MyNode"></param>
        private void MoveLayer(TreeNode MyNode)
        {
            int index = 0;
            ILayer pLayer = null;

            if (MyNode.Parent.Name == "axMapControl")//获取节点名
            {
                IMap map = this.axMapControl.Map;
                for (int i = 0; i < this.axMapControl.LayerCount; i++)
                {
                    if (MyNode.Text == this.axMapControl.get_Layer(i).Name)
                    {
                        pLayer = this.mapHBWD.get_Layer(i);//获得移动的图层
                        index = MyNode.Index;
                        break;
                    }
                }
                map.MoveLayer(pLayer, index);//将pLayer移动到index出
            }
        }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值