2016-12-07 14 views
1

私は複数のグループで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)})"; 
} 

Grid View

今、私がしたいと思います再帰的に行数を表示すると、最初のレベルは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; 
} 
+0

あなたGetChildRowCount呼び出しは常にあなたの最初のレベルの子行の少なくとも一つのループの間に1つの以上の数を返すようです。このシナリオをブレークポイントで確認できますか?これをチェックして、ServerModeを使用しますか? https://www.devexpress.com/Support/Center/Question/Details/T393756 – jambonick

+0

ServerModeプロパティとこのリンクは、ASPxGridViewに関連しています。私はwinformsのためにXtraGridを使用しています。 – Marc

+0

レベル1の子行(カテゴリ行)がグループ行そのものの場合、おそらくGetChildRowHandle()関数呼び出しは正しい結果を返しません。この場合、次のGetRowCountRecursive呼び出しwiil中のGetChildRowCount()の呼び出しは、結果がさらに混在します。 forループ中に無効な行ハンドルまたは間違った番号が返ってくるのを確認できますか? – jambonick

答えて

1

によって増加する必要があります。 GroupRowInfoクラスのインスタンスは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})"; 
} 
ここ

はスクリーンショットです: Screenshot

2

私はchildRowHandleIsGroupRow()を持つグループ行であるかどうかを確認するために欠けていました。 、再帰が停止しtotalCountする必要がない場合は、行数を取得するためにGroupRowInfo.ChildControllerRowCountプロパティを使用することができます。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