Edit this page

Export Data in a Group to Excel

Sometimes you may need to export just the data in a group in a grouped RadGridView. This is possible by using the context menu:

1. Create RadContextMenu and get the right-clicked group header row by using the MouseDown event and the GetGridGroupHeaderRowElement method. After determining the clicked group row, you can get its child rows. Then simply show the context menu:

GridViewChildRowCollection childRowsForExport;
void radGridView1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        GridGroupHeaderRowElement headerRowElement = this.GetGridGroupHeaderRowElement(e.Location);
        RadContextMenu radContextMenu1 = new RadContextMenu();
        RadMenuItem contextMenuItem = new RadMenuItem();

        contextMenuItem.Text = "Export to Excel";
        contextMenuItem.Click += new EventHandler(contextMenuItem_Click);
        radContextMenu1.Items.Add(contextMenuItem);
        if (headerRowElement != null)
        {
            this.childRowsForExport = headerRowElement.RowInfo.ChildRows;
            radContextMenu1.DropDown.Location = this.PointToScreen(e.Location);
            radContextMenu1.Show();
        }
    }
}
private GridGroupHeaderRowElement GetGridGroupHeaderRowElement(Point location)
{
    RadElement elementUnderMouse = this.radGridView1.ElementTree.GetElementAtPoint(location);
    while (elementUnderMouse != null)
    {
        GridGroupHeaderRowElement headerRow = elementUnderMouse as GridGroupHeaderRowElement;
        if (headerRow != null)
        {
            return headerRow;
        }
        elementUnderMouse = elementUnderMouse.Parent;
    }
    return null;
}

Private childRowsForExport As GridViewChildRowCollection
Private Sub radGridView1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles RadGridView1.MouseDown
    If e.Button = MouseButtons.Right Then
        Dim headerRowElement As GridGroupHeaderRowElement = Me.GetGridGroupHeaderRowElement(e.Location)
        Dim radContextMenu1 As New RadContextMenu()
        Dim contextMenuItem As New RadMenuItem()
        contextMenuItem.Text = "Export to Excel"
        AddHandler contextMenuItem.Click, AddressOf contextMenuItem_Click
        radContextMenu1.Items.Add(contextMenuItem)
        If headerRowElement IsNot Nothing Then
            Me.childRowsForExport = headerRowElement.RowInfo.ChildRows
            radContextMenu1.DropDown.Location = Me.PointToScreen(e.Location)
            radContextMenu1.Show()
        End If
    End If
End Sub
Private Function GetGridGroupHeaderRowElement(ByVal location As Point) As GridGroupHeaderRowElement
    Dim elementUnderMouse As RadElement = Me.RadGridView1.ElementTree.GetElementAtPoint(location)
    While elementUnderMouse IsNot Nothing
        Dim headerRow As GridGroupHeaderRowElement = TryCast(elementUnderMouse, GridGroupHeaderRowElement)
        If headerRow IsNot Nothing Then
            Return headerRow
        End If
        elementUnderMouse = elementUnderMouse.Parent
    End While
    Return Nothing
End Function

2. Since the export to excel methods do not support exporting only specified records, you can work-around this if you temporarily hide the unnecessary rows and use ExportToExcelML class with the DonNotExport for HiddenRowOption properties.

3. In the click event of the context menu item, mark the rows in the RadGridView.Rows collection that match the rows of the child collection by setting their IsVisible property to true, and all the rest to false. Then simply export RadGridView with HiddenRowOption set to HiddenOption.DoNotExport:

void contextMenuItem_Click(object sender, EventArgs e)
{
    if (this.childRowsForExport != null && this.childRowsForExport.Count > 0)
    {
        SaveFileDialog dialog = new SaveFileDialog();
        dialog.Filter = "Excel File (*.xls)|*.xls";
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            //hide rows, which should not be exported
            foreach (GridViewRowInfo row in this.radGridView1.Rows)
            {
                bool isVisible = false;
                foreach (GridViewRowInfo childRow in this.childRowsForExport)
                {
                    if (row == childRow)
                    {
                        isVisible = true;
                    }
                }
                row.IsVisible = isVisible;
            }
            ExportToExcelML exporter = new ExportToExcelML(this.radGridView1);
            exporter.HiddenRowOption = HiddenOption.DoNotExport;
            exporter.RunExport(dialog.FileName);
            MessageBox.Show("Export Finished");
        }
        //show all rows
        foreach (GridViewRowInfo row in this.radGridView1.Rows)
        {
            row.IsVisible = true;
        }
    }
    //release resources
    RadMenuItem menuItem = (RadMenuItem)sender;
    menuItem.Click -= contextMenuItem_Click;
    this.childRowsForExport = null;
}

Private Sub contextMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs)
    If Me.childRowsForExport IsNot Nothing AndAlso Me.childRowsForExport.Count > 0 Then
        Dim dialog As New SaveFileDialog()
        dialog.Filter = "Excel File (*.xls)|*.xls"
        If dialog.ShowDialog() = DialogResult.OK Then
            'hide rows, which should not be exported
            For Each row As GridViewRowInfo In Me.RadGridView1.Rows
                Dim isVisible As Boolean = False
                For Each childRow As GridViewRowInfo In Me.childRowsForExport
                    If row.Equals(childRow) Then
                        isVisible = True
                    End If
                Next
                row.IsVisible = isVisible
            Next
            Dim exporter As New ExportToExcelML(Me.RadGridView1)
            exporter.HiddenRowOption = HiddenOption.DoNotExport
            exporter.RunExport(dialog.FileName)
            MessageBox.Show("Export Finished")
        End If
        'show all rows
        For Each row As GridViewRowInfo In Me.RadGridView1.Rows
            row.IsVisible = True
        Next
    End If
    'release resources
    Dim menuItem As RadMenuItem = DirectCast(sender, RadMenuItem)
    RemoveHandler menuItem.Click, AddressOf contextMenuItem_Click
    Me.childRowsForExport = Nothing
End Sub

4. If you need to get the text from the GroupRowHeader, use the following snippet:

private string GetGroupLineHeaderText(GridGroupHeaderRowElement headerRowElement)
{
    string headerText = headerRowElement.RowInfo.Group.GroupRow.HeaderText;
    return headerText;
}

Private Function GetGroupLineHeaderText(ByVal headerRowElement As GridGroupHeaderRowElement) As String
    Dim headerText As String = headerRowElement.RowInfo.Group.GroupRow.HeaderText
    Return headerText
End Function

See Also