TreeView的拖拽处理

TreeView的节点拖拽处理功能。

1. 只允许拖拽子节点。

2. 不允许拖拽到自己身上。

3. 拖拽到同级节点上时,调整顺序。

4. 拖拽到其他顶级节点上时,改变阵营。


private void tv1_ItemDrag(object sender, ItemDragEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        //只处理左键拖拽操作;
        m_targetNode = null;
        TreeNode _node = (TreeNode)e.Item;
        //只允许拖拽子级节点;
        if (_node.Level > 0)
        {
            //开始拖拽;
            DoDragDrop(e.Item, DragDropEffects.Move | DragDropEffects.Copy);
        }
    }
}

TreeNode m_targetNode;      //用于记录当前拖拽到的目标节点;
private void tv1_DragDrop(object sender, DragEventArgs e)
{
    if (m_targetNode != null)
    {
        TreeNode _node = (TreeNode)e.Data.GetData(typeof(TreeNode));
        if (!m_targetNode.Equals(_node))
        {

            if (m_targetNode.Level == _node.Level)
            {
                //1. 不同的父节点;
                //2. 被拖拽的节点不在目标节点的上面(相邻);
                if (!_node.Parent.Equals(m_targetNode.Parent) || m_targetNode.Index - 1 != _node.Index)
                {
                    _node.Remove();
                    m_targetNode.Parent.Nodes.Insert(m_targetNode.Index, _node);
                }
            }
            else
            {
                //改变阵营;
                _node.Remove();
                m_targetNode.Nodes.Add(_node);
            }
        }
        m_targetNode.BackColor = Color.Empty;
        m_targetNode = null;
        _node = null;

    }

}

private void tv1_DragOver(object sender, DragEventArgs e)
{

    //获取当前拖拽到的目标节点;
    TreeNode _node2 = tv1.GetNodeAt(tv1.PointToClient(new Point(e.X, e.Y)));

    //清除前一个目标节点的颜色标识;
    if (_node2 == null || !_node2.Equals(m_targetNode))
    {
        if (m_targetNode != null)
        {
            m_targetNode.BackColor = Color.Empty;
        }
    }
    m_targetNode = null;

    if (_node2 != null)
    {
        //顶级节点,允许
        m_targetNode = _node2;
        m_targetNode.BackColor = Color.Gray;
        e.Effect = DragDropEffects.Move;
    }
    else
    {
        //禁止;
        e.Effect = DragDropEffects.None;
    }

}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值