因为cxTreeList比cxGrid更简单易用,所以在一些需要显示非数据绑定列表的场合,我通常都会选择使用cxTreeList。
cxTreeList和cxGrid一样,都支持多列排序,只需将OptionsBehavior.MultiSort属性设置成True就可以了。
在运行期设置多列排序很简单,按住Shift键依次点击表头,就会按照点击的顺序进行多列排序。
上面的效果就是按住Shift键依次点击『年级』、『班级』、『姓名』得到的。
可是想要在代码中实现同样的效果却遇到了问题,ExpressQuantumGrid的帮助Sorting Data有一段Demo,代码如下:


1

2

3

4

5

6

按照上面的Demo去依次设置cxTreeList,却发现设置后只有最后一列正确设置为排序状态。当设置第二个列的排序状态时,会自动清除第一个列的排序设置。Column有一个SortIndex属性,原本是用来标识列的排序顺序的,可是当设置列的SortOrder时,其他列的SortOrder会自动设置为soNone,SortIndex也为自动设置为-1。
研究了一下cxTreeListColumn的源码,发现设置SortOrder会执行SetSortOrder,而SetSortOrder会调用ChangeSortOrder,最终会调用TcxCustomTreeList.ColumnSortOrderChanged。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

在上面代码的第7行,我们可以看出AShift参数传入的是[],因此在上面代码的第36行会执行清除所有列排序的操作。
原因是找到了,问题就好办了,只需要在设置SortOrder的时候将AShift参数设置为[ssShift]就可以了,可是ChangeSortOrder是protected的,无法直接调用。
怎么办?这个是老把戏了。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15
