Ja, das ist möglich und kann mit der IComparer-Schnittstelle exakt erreicht werden. Jede UltraGrid-Spalte verfügt über eine SortComparer-Eigenschaft, der ein Objekt zugewiesen werden kann, das die IComparer-Schnittstelle implementiert. Wie in der Dokumentation über die Immobilie SortComparer geschrieben:
Property verwendet, um benutzerdefinierten auszuführen Vergleiche sortieren, wenn Zeilen von in dieser Spalte zu sortieren. Die Werte, die in der Compare-Methode des IComparers übergeben werden, sind zwei UltraGridCell-Objekte.
Hier ist ein Codeschnipsel zu Ihrem Szenario, da die Vergleichswerte aus einer anderen Spalte stammen.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ultraGrid1.DataSource = InitializeDataSource(10);
ultraGrid1.DisplayLayout.Override.HeaderClickAction = HeaderClickAction.SortMulti;
ultraGrid1.DisplayLayout.Bands[0].Columns[0].SortComparer = new CustomComparer();
}
private DataTable InitializeDataSource(int rows)
{
DataTable table = new DataTable();
table.Columns.Add("String Column", typeof(string));
table.Columns.Add("Long Column", typeof(long));
for (int index = 0; index < rows; index++)
{
table.Rows.Add(new object[] { "Text", index });
}
return table;
}
}
public class CustomComparer : IComparer
{
public int Compare(object x, object y)
{
var valueColumn = "Long Column";
var firstCell = x as UltraGridCell;
var secondCell = y as UltraGridCell;
var firstCellValue = (long)firstCell.Row.Cells[valueColumn].Value;
var secondCellValue = (long)secondCell.Row.Cells[valueColumn].Value;
if (firstCellValue == secondCellValue)
{
return 0;
}
else if (firstCellValue > secondCellValue)
{
return -1;
}
else
{
return 1;
}
}
}