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)