自定义排序
XtraTreeList 控件允许实现自定义排序算法。 接管 TreeList.CompareNodeValues 事件来实现此目的。 在对列应用排序时,每次当列中节点的取值必须被比较时,此事件都发生。 可以人工指定比较结果,来为被排序的节点提供自定义排列。
节点取值的比较结果通过事件参数的 CompareNodeValuesEventArgs.Result 属性指定。 如果它是负数,则认为第一项被比较的取值较小。 如果它是正数,则认为第一项被比较的取值较大。 把 CompareNodeValuesEventArgs.Result 参数设置为 0 则指定节点有相同的取值。 最初,此参数包含一个指明标准比较结果的取值。
示例
下面的代码实现了自定义排序算法。 接管了 TreeList.CompareNodeValues 事件来实现此目的。 所实现的排序机制把有子节点的节点排列在上面,而把没有子节点的节点排列在下面。
下面的插图显示了按照 Department 列以升序和降序排序的控件。 注意, Finance 节点始终位于有子节点的节点的下面。
C# | 复制代码 |
---|---|
using DevExpress.XtraTreeList; private void treeList1_CompareNodeValues(object sender, CompareNodeValuesEventArgs e) { if (e.Node1.HasChildren && !e.Node2.HasChildren) e.Result = e.SortOrder == SortOrder.Ascending ? -1 : 1; if (!e.Node1.HasChildren && e.Node2.HasChildren) e.Result = e.SortOrder == SortOrder.Ascending ? 1 : -1; } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraTreeList Private Sub TreeList1_CompareNodeValues(ByVal sender As Object, _ ByVal e As CompareNodeValuesEventArgs) Handles TreeList1.CompareNodeValues If e.Node1.HasChildren And Not e.Node2.HasChildren Then e.Result = IIf(e.SortOrder = SortOrder.Ascending, -1, 1) End If If Not e.Node1.HasChildren And e.Node2.HasChildren Then e.Result = IIf(e.SortOrder = SortOrder.Ascending, 1, -1) End If End Sub |
示例
如果需要把字符串值视为数字进行排序,则可以使用自定义排序。 假设在列中存在取值“2”和“10”。 如果使用标准的排序,则认为“10”小于“2”。 因此,编写下列 TreeList.CompareNodeValues 事件处理程序来避免这种行为。
C# | 复制代码 |
---|---|
private void treeList1_CompareNodeValues(object sender, DevExpress.XtraTreeList.CompareNodeValuesEventArgs e) { if(e.Column.Caption != "Budget") return; try { int value1 = Convert.ToInt32(e.NodeValue1); int value2 = Convert.ToInt32(e.NodeValue2); e.Result = value1 - value2; } catch {} } |
Visual Basic | 复制代码 |
---|---|
Private Sub TreeList1_CompareNodeValues(ByVal sender As Object, _ ByVal e As DevExpress.XtraTreeList.CompareNodeValuesEventArgs) _ Handles TreeList1.CompareNodeValues If e.Column.Caption <> "Budget" Then Exit Sub Try Dim Value1 As Integer = Convert.ToInt32(e.NodeValue1) Dim Value2 As Integer = Convert.ToInt32(e.NodeValue2) e.Result = Value1 - Value2 Catch End Try End Sub |
把字符串值视为数字进行排序并不是执行自定义排序的唯一原因。 如果需要根据节点的属性,或者根据其他列中的数据进行排序,那么也可以使用此功能。