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;
}
}