ItemDrag   //开始拖动
DragOver   //拖动
DragDrop   //拖动后放置

解决方案 »

  1.   

    下面是一个实例中的代码,可能包含一些标识变量,将它们去掉即可: //开始拖动
    private void Tvw_ItemDrag(object sender, ItemDragEventArgs e)
    {
    try
    {
    if (e.Button ==MouseButtons.Left) //左键
    {
    if (this._AllowAlter) //允许修改,允许拖动
    {
    DoDragDrop(e.Item,DragDropEffects.Move);
    }
    }
    }
    catch(Exception err)
    {
    MessageBox.Show(err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
    if (ItemDrag!=null) //触发事件
    {
    ItemDrag(sender,e);
    }
    }
    //拖动
    private void Tvw_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
    {
    try
    {
    // if (e.Data.GetData("System.Windows.Forms.TreeNode")!=null)
    if(e.Data.GetDataPresent("System.Windows.Forms.TreeNode")) //TreeNode
    {
    Point pos=new Point(e.X,e.Y);
    pos=this.Tvw.PointToClient(pos);
    if (Tvw.GetNodeAt(pos.X,pos.Y)!=null) //当前项不空
    {
    TreeNode tnNow=Tvw.GetNodeAt(pos.X,pos.Y);
    TreeNode tnData=(TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
    if (tnData!=tnNow) //不同
    {
    if (IsSon(tnData,tnNow)) //父结点不能拖至子结点
    {
    e.Effect=DragDropEffects.None;
    }
    else
    {
    bool IsFather=false;
    foreach(TreeNode tn in tnNow.Nodes)
    {
    if (tn==tnData) //是否父结点
    {
    IsFather=true;
    break;
    }
    }
    if (IsFather) //目标结点是拖动结点的直接父结点
    {
    e.Effect=DragDropEffects.None;
    }
    else
    {
    e.Effect=DragDropEffects.Move;
    }
    }
    }
    else //本结点
    {
    e.Effect=DragDropEffects.None;
    }
    }
    else
    {
    e.Effect=DragDropEffects.None;
    }
    }
    else
    {
    e.Effect=DragDropEffects.None;
    }
    }
    catch(Exception err)
    {
    MessageBox.Show(err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
    } //拖动后放置
    private void Tvw_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
    {
    try
    {
    if(e.Data.GetDataPresent("System.Windows.Forms.TreeNode")) //拖动项目不空
    {
    Point pos=new Point(e.X,e.Y);
    pos=this.Tvw.PointToClient(pos);
    TreeNode tnData=(TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");
    if (Tvw.GetNodeAt(pos.X,pos.Y)!=null) //当前项不空
    {
    TreeNode tnNow=Tvw.GetNodeAt(pos.X,pos.Y);
    DialogResult dResult=MessageBox.Show("您确定要将权限 “" + tnData.Text + "” 作为 “" + tnNow.Text + "” 的子权限吗?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
    if (dResult==DialogResult.OK) //OK,Move
    {
    if (MoveModule(tnData.Tag.ToString(),tnNow.Tag.ToString())) //数据库中移动成功
    {
    tnNow.Expand();
    Tvw.Nodes.Remove(tnData); //移除原来的结点
    tnNow.Nodes.Add(tnData); //添加至目标结点
    tnNow.Expand();
    Tvw.SelectedNode=tnData;
    this.SelectedNode=tnData;
    this.MouseSelectedNode=tnData;
    }
    }
    Tvw.Focus();
    }
    }
    }
    catch(Exception err)
    {
    MessageBox.Show(err.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
    }
    }