RadTreeView for ASP.NET

Copy or Move nodes from one tree to another using Ctrl key Send comments on this topic.
Example scenarios (How to) > Server-side > Copy or Move nodes from one tree to another using Ctrl key

Glossary Item Box

To copy nodes from one treeview to another, you should make a clone of the dragged TreeNode (sourceNode) and add it to the Nodes collection of the other treeview. An example is shown below. A hidden field is used indicating whether a node is being moved or copied.

Example:

ASPX Copy Code
<script type="text/javascript">
   
function SaveCtrlState(sourceNode, destNode, eventArgs)
   {
       var hidden = document.getElementById("
<%= CtrlKeyField.ClientID %>");

       if (eventArgs.ctrlKey)
       {
           hidden.value = "True";
       }
       else
       {
           hidden.value = "False";
       }
   }
</script>
...
<rad:RadTreeView
   
ID="RadTreeView1"
   
runat="server"
   
DragAndDrop="True"
   
BeforeClientDrop="SaveCtrlState"
   
OnNodeDrop="HandleDrop"
   
ContentFile="tree.xml">
</
rad:RadTreeView>
...
<rad:RadTreeView
   
ID="RadTreeView2"
    
runat="server"
   
DragAndDrop="True"
   
ContentFile="tree.xml">
</
rad:RadTreeView>
...
<asp:HiddenField
   
ID="CtrlKeyField"
   
runat="server"
   
Value="False"/>
        
C# Copy Code
protected void Page_Load(object sender, EventArgs e)
{
   
if (CtrlKeyField.Value == "False")
   {
       remove = false;
   }
   
else
   {
       
remove = true;
   }
}

protected void HandleDrop(object sender, RadTreeNodeEventArgs e)
{
   RadTreeNode sourceNode = e.SourceDragNode;
   RadTreeNode destNode = e.DestDragNode;

   
if (destNode != null)
   {
       
if (sourceNode.TreeView.SelectedNodes.Count <= 1)
       {
           PerformDragAndDrop(sourceNode, destNode);
       }
       
else if (sourceNode.TreeView.SelectedNodes.Count > 1)
       {
           
foreach (RadTreeNode currentNode in sourceNode.TreeView.SelectedNodes)
           {
               PerformDragAndDrop(currentNode, destNode);
           }
       }

       destNode.Expanded = true;
   }

}

private void PerformDragAndDrop(RadTreeNode sourceNode, RadTreeNode destNode)
{
   
if (sourceNode.Equals(destNode) || sourceNode.IsAncestorOf(destNode))
   {
       
return;
   }

   
// clone the sourceNode
   
RadTreeNode sourceNodeClone = CloneNode(sourceNode);

   
if (remove == false)
   {
       sourceNode.Owner.Nodes.Remove(sourceNode);
   }

   
// add source node as a child of the destination node
   
if (!sourceNode.IsAncestorOf(destNode))
   {
       destNode.Nodes.Add(sourceNodeClone);
   }

}

private RadTreeNode CloneNode(RadTreeNode sourceNode)
{
   RadTreeNode clonedNode =
new RadTreeNode();
   clonedNode.Text = sourceNode.Text;
   clonedNode.Value = sourceNode.Value;
   clonedNode.ImageUrl = sourceNode.ImageUrl;
   clonedNode.ImageExpandedUrl = sourceNode.ImageExpandedUrl;

   
return clonedNode;

}
        
VB.NET Copy Code
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    If (CtrlKeyField.Value = "False") Then
        remove = false
    Else
        remove = true
    End If
End Sub

Protected Sub HandleDrop(ByVal sender As Object, ByVal e As RadTreeNodeEventArgs)
    Dim sourceNode As RadTreeNode = e.SourceDragNode
    Dim destNode As RadTreeNode = e.DestDragNode
    If (Not (destNode) Is Nothing) Then
        If (sourceNode.TreeView.SelectedNodes.Count <= 1) Then
            PerformDragAndDrop(sourceNode, destNode)
        ElseIf (sourceNode.TreeView.SelectedNodes.Count > 1) Then
            For Each currentNode As RadTreeNode In sourceNode.TreeView.SelectedNodes
                PerformDragAndDrop(currentNode, destNode)
            Next
        End If
        destNode.Expanded = true
    End If
End Sub

Private Sub PerformDragAndDrop(ByVal sourceNode As RadTreeNode, ByVal destNode As RadTreeNode)
    If (sourceNode.Equals(destNode) OrElse sourceNode.IsAncestorOf(destNode)) Then
        Return
    End If
    ' clone the sourceNode
    Dim sourceNodeClone As RadTreeNode = CloneNode(sourceNode)
    If (remove = false) Then
        sourceNode.Owner.Nodes.Remove(sourceNode)
    End If
    ' add source node as a child of the destination node
    If Not sourceNode.IsAncestorOf(destNode) Then
        destNode.Nodes.Add(sourceNodeClone)
    End If
End Sub

Private Function CloneNode(ByVal sourceNode As RadTreeNode) As RadTreeNode
    Dim clonedNode As RadTreeNode = New RadTreeNode
    clonedNode.Text = sourceNode.Text
    clonedNode.Value = sourceNode.Value
    clonedNode.ImageUrl = sourceNode.ImageUrl
    clonedNode.ImageExpandedUrl = sourceNode.ImageExpandedUrl
    Return clonedNode
End Function