此处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出
}
}