Although Xceed Grid for .NET allows for columns to be sorted, by default, in an ascending or descending direction, it is also possible to provide
custom sorting definitions through the use of data comparers.
Data comparers
Any class that implements the IComparer interface can be used by Xceed Grid for .NET to custom sort
columns. To assign a data comparer to a column, the column's DataComparer property must be set.
This data comparer will then be used when sorting the column to which it was assigned. For example:
| C# |
Copy Code |
gridControl1.Columns[ "ShipAddress" ].DataComparer = new AddressComparer(); |
In the example above, we use the AddressComparer class (which is provided below) to compare the values of the ShipAddress column. The
AddressComparer class will first sort addresses which begin with numeric values by street name and then civic number. The remainder of the addresses in the
regular alphabetical fashion. For example, if we were to use the default data comparer for the ShipAddress column, the result would be something like
:

Using the AddressComparer data comparer class, the result would be:
AddressComparer class
| C# |
Copy Code |
|
using System;
using System.Collections;
namespace Xceed.Grid.Samples;
{
public class AddressComparer : IComparer
{
public AddressComparer()
{
}
int
IComparer.Compare( object x, object y )
{
if( x is string && y is string
)
{
const string digits =
"0123456789";
if( ( digits.IndexOf( ( ( string )x )[ 0 ] ) >= 0 ) &&
( digits.IndexOf( ( ( string )y )[ 0 ] ) >= 0 )
)
{
int index = 0;
System.Text.StringBuilder xNumber = new
System.Text.StringBuilder();
while( ( index < ( ( string )x ).Length ) &&
(
digits.IndexOf( ( ( string )x )[ index ] ) >= 0 ) )
{
xNumber.Append( ( ( string )x )[
index ] );
index++;
}
index = 0;
System.Text.StringBuilder yNumber = new
System.Text.StringBuilder();
while( ( index < ( ( string )y ).Length )&&
(
digits.IndexOf( ( ( string )y )[ index ] ) >= 0 ) )
{
yNumber.Append( ( ( string )y )[
index ] );
index++;
}
long xValue = long.Parse( xNumber.ToString() );
long yValue = long.Parse( yNumber.ToString()
);
if( xValue > yValue )
return 1;
if( xValue < yValue )
return
-1;
return ( ( string )x ).CompareTo( ( string )y );
}
else
{
return ( ( string )x ).CompareTo( ( string )y
);
}
}
throw new ArgumentException(
"Can only compare string values" );
}
}
}
|