#region "拖放相关"
public bool CanDragDrop
{
get{return _CanDragDrop;}
set
{
_CanDragDrop=value;
if (_CanDragDrop)
{
this.ItemDrag  += new System.Windows.Forms.ItemDragEventHandler(TreeView_ItemDrag);
this.DragEnter += new System.Windows.Forms.DragEventHandler(TreeView_DragEnter);
this.DragDrop += new System.Windows.Forms.DragEventHandler(TreeView_DragDrop);
}
else
{
this.ItemDrag  -= new System.Windows.Forms.ItemDragEventHandler(TreeView_ItemDrag);
this.DragEnter -= new System.Windows.Forms.DragEventHandler(TreeView_DragEnter);
this.DragDrop -= new System.Windows.Forms.DragEventHandler(TreeView_DragDrop);}
}
}protected void TreeView_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
{
this._DragNode  = (TreeNode)e.Item;
string strItem = e.Item.ToString();
DoDragDrop(strItem, DragDropEffects.Copy |  DragDropEffects.Move);
}protected void TreeView_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Text)) 
{
if ((e.KeyState & 4) == 4 &&  (e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) 
{   // SHIFT KeyState for move.
e.Effect = DragDropEffects.Move;
}
else if ((e.KeyState & 8) == 8 && (e.AllowedEffect & DragDropEffects.Copy) == DragDropEffects.Copy)
{
// CTL KeyState for copy.
e.Effect = DragDropEffects.Copy;
}
else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)  
{
// By default, the drop action should be move, if allowed.
e.Effect = DragDropEffects.Move;} 
else
e.Effect = DragDropEffects.None;
}
else
e.Effect = DragDropEffects.None;}

protected void TreeView_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{

Point Position = new Point(e.X ,e.Y );
Position = this.PointToClient(Position);
TreeNode DropNode = this.GetNodeAt(Position);TreeNode tNode=(TreeNode)_DragNode.Clone (); //因为拖放操作可能是复制型,
if (DropNode != null  )
{ this.AddNode (DropNode,tNode); }
else
{ this.AddNode (null,tNode); }

if ((e.Effect & DragDropEffects.Move) ==DragDropEffects.Move )
{ this.DeleteNode(_DragNode); }}