User (Old forums)MemberNovember 25, 2004 at 4:54 amPost count: 23064
I have data in the grid that is grouped, this groups itself could contain sub groups and so on..
Up to now I calculate 2 values of sub items:
– 1st all Data items: GetSortedDataRows(Recursive) – All Items
– 2nd only direct children: ex. thisGroup.groups.count
Now I want to sort the groups in one level by the count of direct children,
but I couldn’t find any way to solve the problem.
Is anybody out there, who can help me ?
Thanks in Advance
Imported from legacy forums. Posted by robert (had 2353 views)User (Old forums)MemberMarch 31, 2005 at 10:15 amPost count: 23064
It is possible to do so by setting your own DataComparer to all of your columns.
Your dataComparer must find out if the object being compared is a group’s key or a cell’s value. This must be done through a reference to the column which the dataComparer resides on.
First, check if the DataComparer’s column is currently being grouped by. If it is, return the grouping level. If the column is grouped, we now know that the values being compared are in fact group keys.
Using that level, find the precise group for both object. Once you have a reference for both groups being compared, call GetSortedDataRowCount(true) on them to get the group’s dataRows count. Use these count to return the right result.
If the dataComparer’s column is not being grouped by, implement basic comparison.
Note that doing this kind of sorting will be slower and slower the more you have rows, groups, and grouping levels. I tested it on a P3 512 Mb RAM, with a grid containing 3 columns, 1000 dataRows, and two grouping levels containing about 700 groups each… It took about 2 seconds to sort by a column (if that column is grouped by).
Here is my DataComparer class that I created:
/// Comparer class that sorts groups by rows count
public class myComparer : IComparer
public myComparer(Xceed.Grid.Column Column)
this.m_Column = Column;
private int FindGroupLevel()
foreach( Group group in this.m_Column.ParentGrid.GroupTemplates )
if( group.GroupBy == this.m_Column.FieldName )
return – 1;
private Xceed.Grid.Group FindGroup( object key, int GroupLevel, Xceed.Grid.Collections.ReadOnlyGroupList Groups )
for( int i = 0; i < Groups.Count; i ++ )
Group group = Groups[ i ];
if( group.Level == GroupLevel )
if( group.Key.Equals( key ) )
Xceed.Grid.Group foundGroup = this.FindGroup( key, GroupLevel, group.Groups );
if( foundGroup != null )
#region IComparer Members
public int Compare( object x, object y )
// find if the column is grouped, if it is get the group
int GroupLevel = this.FindGroupLevel();
if( GroupLevel > -1 )
Xceed.Grid.Collections.ReadOnlyGroupList groupList = this.m_Column.ParentGrid.Groups;
Group groupX = this.FindGroup( x, GroupLevel, groupList );
Group groupY = this.FindGroup( y, GroupLevel, groupList );
int groupXRowsCount = groupX.GetSortedDataRowCount( true );
int groupYRowsCount = groupY.GetSortedDataRowCount( true );
if( groupXRowsCount > groupYRowsCount )
if( groupXRowsCount < groupYRowsCount )
IComparable xComparable = x as IComparable;
if( xComparable != null )
return xComparable.CompareTo( y );
IComparable yComparable = y as IComparable;
if( yComparable != null )
return -yComparable.CompareTo( x );
private Xceed.Grid.Column m_Column;
Imported from legacy forums. Posted by PL (had 3401 views)
- You must be logged in to reply to this topic.