在 Devexpress XtraGrid GroupRow 中显示递归行数

Show recursive row count in Devexpress XtraGrid GroupRow

我有一个包含多个组的 gridview,我使用 CustomDrawGroupRow 事件显示每个组的行数:

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)})";
}

现在我想递归显示行数,所以第一层显示的数是2171(1913 + 135 + 123)。

这是我尝试过的方法,但它抛出一个 WhosebugException,我在这里看不到问题:

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;
}

我没有检查 childRowHandle 是否是 IsGroupRow() 的组行。如果不是,递归必须停止并且 totalCount 需要增加 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;
}

您可以使用 GroupRowInfo.ChildControllerRowCount 属性 来获取行数。 GroupRowInfo class 的实例你可以从 GridGroupRowInfo.RowKey 属性.
得到 这是示例:

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})";
}

截图如下: