How to: Perform Drag And Drop in Virtual Mode

  • 2 minutes to read

If the ASPxTreeList operates in Virtual Mode, you should manually process node drag and drop operations. To do this, you should handle the ASPxTreeList.ProcessDragNode event.

In this example, dragged nodes correspond to files and folders. The ASPxTreeList.ProcessDragNode event is handled to move required files to a new location. Finally, the ASPxTreeList.RefreshVirtualTree method is called to recreate the tree. Don't forget to turn off the default drag-and-drop processing by setting the event parameter's Handled property to true. Otherwise, an exception will be thrown.

using System.IO;
using System.Collections.Generic;
using DevExpress.Web.ASPxTreeList;

protected void ASPxTreeList1_ProcessDragNode(object sender, TreeListNodeDragEventArgs e) {
    MoveFileToNewFolder(e.Node["FileName"].ToString(), e.NewParentNode["FileName"].ToString());
    e.Handled = true;

protected void ASPxTreeList1_VirtualModeCreateChildren(object sender,
TreeListVirtualModeCreateChildrenEventArgs e) {
    string path = e.NodeObject == null ? Page.MapPath("~/") : e.NodeObject.ToString();

    List<string> children = new List<string>();
    if (Directory.Exists(path)) {
        foreach (string name in Directory.GetDirectories(path)) {
            if (!IsSystemName(name))
        foreach (string name in Directory.GetFiles(path))
            if (!IsSystemName(name))
    e.Children = children;
protected void ASPxTreeList1_VirtualModeNodeCreating(object sender,
TreeListVirtualModeNodeCreatingEventArgs e) {
    string path = e.NodeObject.ToString();

    e.NodeKeyValue = GetNodeGuid(path);
    e.IsLeaf = !Directory.Exists(path);
    e.SetNodeValue("FileName", PopFileName(path));

#region Helpers
Guid GetNodeGuid(string path) {
    if (!Map.ContainsKey(path))
        Map[path] = Guid.NewGuid();
    return Map[path];
Dictionary<string, Guid> Map {
    get {
        const string key = "DX_PATH_GUID_MAP";
        if (Session[key] == null)
            Session[key] = new Dictionary<string, Guid>();
        return Session[key] as Dictionary<string, Guid>;
string PopFileName(string path) {
    return path.Substring(1 + path.LastIndexOf("\\"));
bool IsSystemName(string name) {
    name = PopFileName(name).ToLower();
    return name.StartsWith("app_") || name == "bin"
        || name.EndsWith(".aspx.cs") || name.EndsWith(".aspx.vb");