我想在Infgragistics中使用自定义排序。我读到我可以使用icomparer。
我有一个带有字符串数据类型的Ultragridcolumnd。我喜欢从另一列是长的数据类型中按值进行排序。
有可能吗?
是的,这是可能的,可以使用ICOMPARER接口确切地实现。每个Ultragrid列都有sortComparer属性,可以分配实现ICOMPARER接口的对象。如文档中有关sortcomparer属性的文档:
属性用于执行自定义排序比较时进行排序时 此列。在iComparer的比较方法中传递的值 将是两个Ultragridcell对象。
这是有关您的方案的代码段,因为比较值来自另一列。
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;
}
}
}