繁体   English   中英

在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)。

这是我试过的,但它抛出了StackOverflowException ,我在这里看不到问题:

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属性来获取行计数。 您可以从GridGroupRowInfo.RowKey属性获取GroupRowInfo类的实例。
这是一个例子:

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

这是截图: 截图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM