Marc
Marc

Reputation: 3959

Show recursive row count in Devexpress XtraGrid GroupRow

I have a gridview with multiple groups and I use the CustomDrawGroupRow Event to display the row count for each group:

private void gridView_CustomDrawGroupRow(object sender, DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventArgs e)
{
    var view = (GridView)sender;
    var info = (GridGroupRowInfo)e.Info;
    var caption = info.Column.Caption;
    if (info.Column.Caption == string.Empty)
    {
        caption = info.Column.ToString();
    }
    info.GroupText = $"{caption} : {info.GroupValueText} ({view.GetChildRowCount(e.RowHandle)})";
}

Grid View

Now I would like to display the row count recursively, so that the first level shows a count of 2171 (1913 + 135 + 123).

This is what I have tried, but it throws a StackOverflowException and I cannot see the problem here:

private void gridView_CustomDrawGroupRow(object sender, DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventArgs e)
{
    var view = (GridView)sender;
    var info = (GridGroupRowInfo)e.Info;
    var caption = info.Column.Caption;
    if (info.Column.Caption == string.Empty)
    {
        caption = info.Column.ToString();
    }
    info.GroupText = $"{caption} : {info.GroupValueText} ({GetRowCountRecursive(view, e.RowHandle)})";
}

private int GetRowCountRecursive(GridView view, int rowHandle)
{
    int totalCount = 0;
    int childrenCount = view.GetChildRowCount(rowHandle);
    for (int i = 0; i < childrenCount; i++)
    {
        var childRowHandle = view.GetChildRowHandle(rowHandle, i);
        totalCount += GetRowCountRecursive(view, childRowHandle);
    }
    return totalCount;
}

Upvotes: 1

Views: 1314

Answers (2)

nempoBu4
nempoBu4

Reputation: 6621

You can use GroupRowInfo.ChildControllerRowCount property to get the row count. The instance of GroupRowInfo class you can get from GridGroupRowInfo.RowKey property.
Here is example:

private void gridView1_CustomDrawGroupRow(object sender, RowObjectCustomDrawEventArgs e)
{
    var view = (GridView)sender;
    var info = (GridGroupRowInfo)e.Info;
    var caption = info.Column.Caption;
    if (info.Column.Caption == string.Empty)
    {
        caption = info.Column.ToString();
    }

    var groupInfo = info.RowKey as GroupRowInfo;

    info.GroupText = $"{caption} : {info.GroupValueText} ({groupInfo?.ChildControllerRowCount})";
}

Here is the screenshot: Screenshot

Upvotes: 1

Marc
Marc

Reputation: 3959

I was missing to check if childRowHandle is a group row with IsGroupRow(). If not, the recursion have to stop and totalCount need to be increased by 1.

private int GetRowCountRecursive(GridView view, int rowHandle)
{
    int totalCount = 0;
    int childrenCount = view.GetChildRowCount(rowHandle);
    for (int i = 0; i < childrenCount; i++)
    {
        var childRowHandle = view.GetChildRowHandle(rowHandle, i);
        if (view.IsGroupRow(childRowHandle))
        {
            totalCount += GetRowCountRecursive(view, childRowHandle);
        }
        else
        {
            totalCount++;
        }
    }
    return totalCount;
}

Grid View

Upvotes: 2

Related Questions