对节点的拖动通常需要三个步骤:选择需拖放节点,选择拖放位置和执行操作。
如果需要实现多个节点同时拖放的话,那么就要在构造函数中设置多选功能:
ultraTree2.Override.SelectionType
=
SelectType.ExtendedAutoDrag;
//
实现多选功能
在这之前需要设置个全局变量:拖放位置的节点。
private
UltraTreeNode AfterNode;
好了,现在开始执行第一步:在这个步骤中要用到DragDrop事件。
private
void
ultraTree2_DragDrop(
object
sender, DragEventArgs e)
...{
UltraTreeNode BeforeNode = null ;
SelectedNodesCollection SelectedNodes;
SelectedNodes = (SelectedNodesCollection)e.Data.GetData( typeof (SelectedNodesCollection));
SelectedNodes = SelectedNodes.Clone() as SelectedNodesCollection;
SelectedNodes.SortByPosition();
// 只允许最小等级的拖动
if (SelectedNodes[ 0 ].Level == 2 )
...{
// 拖到父级时
if (AfterNode.Level == 1 )
...{
for ( int i = 0 ; i <= (SelectedNodes.Count - 1 ); i ++ )
...{
BeforeNode = SelectedNodes[i];
BeforeNode.Reposition(AfterNode.Nodes);
}
}
// 拖到同等级时
if (AfterNode.Level == 2 )
...{
for ( int i = 0 ; i <= (SelectedNodes.Count - 1 ); i ++ )
...{
BeforeNode = SelectedNodes[i];
BeforeNode.Reposition(AfterNode, NodePosition.Previous);
}
}
}
}
...{
UltraTreeNode BeforeNode = null ;
SelectedNodesCollection SelectedNodes;
SelectedNodes = (SelectedNodesCollection)e.Data.GetData( typeof (SelectedNodesCollection));
SelectedNodes = SelectedNodes.Clone() as SelectedNodesCollection;
SelectedNodes.SortByPosition();
// 只允许最小等级的拖动
if (SelectedNodes[ 0 ].Level == 2 )
...{
// 拖到父级时
if (AfterNode.Level == 1 )
...{
for ( int i = 0 ; i <= (SelectedNodes.Count - 1 ); i ++ )
...{
BeforeNode = SelectedNodes[i];
BeforeNode.Reposition(AfterNode.Nodes);
}
}
// 拖到同等级时
if (AfterNode.Level == 2 )
...{
for ( int i = 0 ; i <= (SelectedNodes.Count - 1 ); i ++ )
...{
BeforeNode = SelectedNodes[i];
BeforeNode.Reposition(AfterNode, NodePosition.Previous);
}
}
}
}
根据拖放的需要可以对LEVEL进行修改。
然后选择拖放位置:
private void ultraTree2_DragOver( object sender, DragEventArgs e)
{
// 根据鼠标拖动的位置获取拖放点的节点
System.Drawing.Point PointInTree;
PointInTree = ultraTree2.PointToClient( new Point(e.X, e.Y));
AfterNode = ultraTree2.GetNodeFromPoint(PointInTree);
e.Effect = DragDropEffects.Move;
}
可以了,需拖放的节点和拖放位置都有了,那么就执行操作吧。
private
void
ultraTree2_SelectionDragStart(
object
sender, EventArgs e)
{
ultraTree2.DoDragDrop(ultraTree2.SelectedNodes, DragDropEffects.Move);
}
{
ultraTree2.DoDragDrop(ultraTree2.SelectedNodes, DragDropEffects.Move);
}
怎么样?感觉很棒吧。