As follows:private void treeView2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
TreeNode newNode;
if( e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
{
Point pt;
TreeNode destinationNode;
pt = treeView2.PointToClient(new Point(e.X, e.Y));
destinationNode = treeView2.GetNodeAt(pt);
newNode = (TreeNode) e.Data.GetData("System.Windows.Forms.TreeNode");
if(destinationNode==null)
{
destinationNode=(TreeNode)newNode.Clone();
treeView2.Nodes.Add(destinationNode);
destinationNode.Expand();
//Remove original node
newNode.Remove(); }
else if(!destinationNode.Equals(newNode))
{
//destinationNode.Nodes.Add(newNode.Clone());
destinationNode.Nodes.Add((TreeNode) newNode.Clone());
destinationNode.Expand();
//Remove original node
newNode.Remove();
} }
}private void treeView2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}private void treeView2_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
{

DoDragDrop(e.Item, DragDropEffects.Move);
}private void treeView1_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
TreeNode newNode;
if( e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false))
{
Point pt;
TreeNode destinationNode;
pt = treeView1.PointToClient(new Point(e.X, e.Y));
destinationNode = treeView1.GetNodeAt(pt);
newNode = (TreeNode) e.Data.GetData("System.Windows.Forms.TreeNode"); if(destinationNode==null)
{
destinationNode=(TreeNode)newNode.Clone();
treeView1.Nodes.Add(destinationNode);
destinationNode.Expand();
//Remove original node
newNode.Remove(); }
else if(!destinationNode.Equals(newNode))
{
//destinationNode.Nodes.Add(newNode.Clone());
destinationNode.Nodes.Add((TreeNode) newNode.Clone());
destinationNode.Expand();
//Remove original node
newNode.Remove();
}
}
}private void treeView1_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}private void treeView1_ItemDrag(object sender, System.Windows.Forms.ItemDragEventArgs e)
{
DoDragDrop(e.Item, DragDropEffects.Move);
}/// <summary>
///  How do I make the TreeView scroll when I drag an item to the top or bottom?
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView1_DragOver(object sender, System.Windows.Forms.DragEventArgs e)
{
TreeView tv = sender as TreeView; 
Point pt = tv.PointToClient(new Point(e.X,e.Y)); 
int delta = tv.Height - pt.Y; 
if ((delta < tv.Height / 2) && (delta > 0)) 

TreeNode tn = tv.GetNodeAt(pt.X, pt.Y); 
if (tn.NextVisibleNode != null) 
tn.NextVisibleNode.EnsureVisible(); 

if ((delta > tv.Height / 2) && (delta < tv.Height)) 

TreeNode tn = tv.GetNodeAt(pt.X, pt.Y); 
if (tn.PrevVisibleNode != null) 
tn.PrevVisibleNode.EnsureVisible(); 

}/// <summary>
/// Show node's tip
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void treeView2_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
TreeNode tn = treeView2.GetNodeAt(e.X, e.Y); 
if(tn != null) 

int currentNodeIndex = tn.Index;  if(currentNodeIndex != oldNodeIndex) 

oldNodeIndex = currentNodeIndex; 
if(this.toolTip1 != null && this.toolTip1.Active) 
this.toolTip1.Active = false; //turn it off 
this.toolTip1.SetToolTip(treeView2, string.Format("tooltip: node {0}", oldNodeIndex)); 
this.toolTip1.Active = true; //make it active so it can show 


}