C1FlexGrid:Filter Node Rows with Empty Child Rows

C1FlexGrid for Winforms is a powerful, full-featured grid that provides maximum flexibility for customization. It allows to summarize data and add aggregate values with the Subtotal method or use the Tree property to display hierarchical views of the data. The Subtotal method adds rows that contain aggregate data for the regular (data) rows.When the Subtotal method adds rows with the aggregate information, it automatically assigns subtotal styles to the new rows (there are built-in styles for 5 levels of subtotals). By design, C1FlexGrid does not automatically hide groups with no visible children when filtering is applied on a grid containing Subtotals. This blog explains how one can customize this behavior such that the Node rows with empty children are not displayed after filtering is applied. To implement this we'll apply custom filtering in the grid and handle the behavior manually.

Creating Subtotals in the grid

c1FlexGrid1.Subtotal(AggregateEnum.Clear);  
c1FlexGrid1.Subtotal(AggregateEnum.None, 0, 1, 1, "{0}");  
c1FlexGrid1.Subtotal(AggregateEnum.None, 1, 2, 2, "{0}");

Apply Custom Filtering


private void c1FlexGrid1_AfterFilter(object sender, EventArgs e)  
{  
    // suspend repainting for efficiency  
    c1FlexGrid1.BeginUpdate();  

    // update totals  
    c1FlexGrid1.Subtotal(AggregateEnum.Clear);  
    c1FlexGrid1.Subtotal(AggregateEnum.None, 0, 1, 1, "{0}");  
    c1FlexGrid1.Subtotal(AggregateEnum.None, 1, 2, 2, "{0}");  

    // hide totals with no visible children  
    int i = 0;  

    for (i = 0; i <= c1FlexGrid1.Rows.Count - 1; i++)  
    {  
        Row r = c1FlexGrid1.Rows[ i ] as Row;  

        if (r.IsNode)  
        {  
            // check if this node has visible children  
            bool hasVisibleChilren = false;  
            CellRange rng = r.Node.GetCellRange();  
            int j = 0;  
            for (j = rng.TopRow; j <= rng.BottomRow; j++)  
            {  
                Row childRow = c1FlexGrid1.Rows[j];  
                if (childRow.IsVisible & !childRow.IsNode)  
                {  
                    hasVisibleChilren = true;  
                    break;  
                }  
            }  

            // show node iff it has visible children  
            r.Visible = hasVisibleChilren;  

        }  
    }  

    // all done  
    c1FlexGrid1.EndUpdate();  
}  

Click the image to get a better understanding of the behavior. Refer the attached samples for the complete implementation. Download Sample CS Download Sample VB

GrapeCity

GrapeCity Developer Tools
comments powered by Disqus