New to Telerik UI for ASP.NET AJAX? Download free 30-day trial

Grid Hierarchy Export

This article covers the export feature of hierarchical RadGrid for the different export types. Not all formats support exporting hierarchical structures but there are possible workarounds:

By default when you set IgnorePaging to true and then export a parent table in hierarchical grid, the expanded items will collapse.

Until Q3 2013, you had to retain the expanded state manually when the control rebinds. Since Q3 2013 version, we introduced a new property named RetainExpandStateOnRebind. When you set enable it, the expanded items’ state will persist automatically.

The following code-library example demonstrates how to persist the expanded state manually.

ExcelML format requires that the HierarchyLoadMode property be set to either Client or ServerBind . When you are using this export format, all items in the hierarchy will expand by default regardless of the state of the RetainExpandStateOnRebind property.

Since UI for ASP.NET AJAX Q3 2015 we have implement a new property named IsExporting which can be used instead of the old approach with a boolean flag. The property is accessible only from the server.

The mentioned below code snippet demonstrates a possible approach to persist the expanded state manually.

private bool isExport = false;

protected void RadGrid1_ItemCommand(object source, GridCommandEventArgs e)
{ 
    //save the expanded/selected state in the session
    if (e.CommandName == RadGrid.ExpandCollapseCommandName)
    {
        //Is the item about to be expanded or collapsed
        if (!e.Item.Expanded)
        {
            //Save its unique index among all the items in the hierarchy
            this.ExpandedStates[e.Item.ItemIndexHierarchical] = true;
        }
        else //collapsed
        {
            this.ExpandedStates.Remove(e.Item.ItemIndexHierarchical);
            this.ClearExpandedChildren(e.Item.ItemIndexHierarchical);
        }
    }
}

private Hashtable _ordersExpandedState;

//Save/load expanded states Hash from the session
//this can also be implemented in the ViewState
private Hashtable ExpandedStates
{
    get
    {
        if (this._ordersExpandedState == null)
        {
            _ordersExpandedState = this.Session["_ordersExpandedState"] as Hashtable;
            if (_ordersExpandedState == null)
            {
                _ordersExpandedState = new Hashtable();
                this.Session["_ordersExpandedState"] = _ordersExpandedState;
            }
        }

        return this._ordersExpandedState;
    }
}

//Clear the state for all expanded children if a parent item is collapsed
private void ClearExpandedChildren(string parentHierarchicalIndex)
{
    string[] indexes = new string[this.ExpandedStates.Keys.Count];
    this.ExpandedStates.Keys.CopyTo(indexes, 0);
    foreach (string index in indexes)
    {
        //all indexes of child items
        if (index.StartsWith(parentHierarchicalIndex + "_") ||
            index.StartsWith(parentHierarchicalIndex + ":"))
        {
            this.ExpandedStates.Remove(index);
        }
    }
}

Protected Sub RadGrid1_ItemCommand(ByVal source As Object, ByVal e As GridCommandEventArgs)
    'save the expanded/selected state in the session
    If e.CommandName = RadGrid.ExpandCollapseCommandName Then
        'Is the item about to be expanded or collapsed
        If Not e.Item.Expanded Then
            'Save its unique index among all the items in the hierarchy
            Me.ExpandedStates(e.Item.ItemIndexHierarchical) = True
        Else
            'collapsed
            Me.ExpandedStates.Remove(e.Item.ItemIndexHierarchical)
            Me.ClearExpandedChildren(e.Item.ItemIndexHierarchical)
        End If
    End If

End Sub
Private _ordersExpandedState As Hashtable

'Save/load expanded states Hash from the session
'this can also be implemented in the ViewState
Private ReadOnly Property ExpandedStates() As Hashtable
    Get
        If Me._ordersExpandedState Is Nothing Then
            _ordersExpandedState = TryCast(Me.Session("_ordersExpandedState"), Hashtable)
            If _ordersExpandedState Is Nothing Then
                _ordersExpandedState = New Hashtable()
                Me.Session("_ordersExpandedState") = _ordersExpandedState
            End If
        End If

        Return Me._ordersExpandedState
    End Get
End Property

'Clear the state for all expanded children if a parent item is collapsed
Private Sub ClearExpandedChildren(ByVal parentHierarchicalIndex As String)
    Dim indexes As String() = New String(Me.ExpandedStates.Keys.Count - 1) {}
    Me.ExpandedStates.Keys.CopyTo(indexes, 0)
    For Each index As String In indexes
        'all indexes of child items
        If index.StartsWith(parentHierarchicalIndex + "_") OrElse index.StartsWith(parentHierarchicalIndex + ":") Then
            Me.ExpandedStates.Remove(index)
        End If
    Next
End Sub
In this article