找回密码
 立即注册

QQ登录

只需一步,快速开始

xue5ya

中级会员

2

主题

12

帖子

538

积分

中级会员

积分
538

活字格认证

最新发帖
xue5ya
中级会员   /  发表于:2014-10-10 15:52  /   查看:16801  /  回复:16
对于Spread设置全部的列都可以进行排序,
                this.fpspdX.ActiveSheet.Columns[0, this.fpspdX.ActiveSheet.Columns.Count - 1].AllowAutoSort = true;
                this.fpspdX.ActiveSheet.Columns[0, this.fpspdX.ActiveSheet.Columns.Count - 1].ShowSortIndicator = false;

当点击其中某一列的列头时,数据以这一列数据为基准进行升序或者降序排序,
但是,当这一列的数据中有重复数据时,数据的排列基准是什么?
看了下排序的结果,针对重复数据,也看不出来是参考哪些列进行升序或者降序排列。
如下图所示:

sort.png


请问,spread数据排序的原理是什么?

16 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2014-10-10 19:15:00
沙发
回复 1楼xue5ya的帖子

问题我们已经查收,调查后反馈给你结果。谢谢
回复 使用道具 举报
xue5ya
中级会员   /  发表于:2014-10-13 11:03:00
板凳
期待ing
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-10-13 15:16:00
地板
回复 3楼xue5ya的帖子

Spread 排序算法为快速排序,所以相同情况下行的顺序并不是固定的。
如果希望其他列也影响排序结果,那么可以通过制定多个排序条件,详细请参考:SortColumns 方法。
回复 使用道具 举报
xue5ya
中级会员   /  发表于:2014-10-13 16:43:00
5#
回复 4楼iceman的帖子

首先,感谢你的回复,
关于回复的内容,自己有一些理解不知道是不是正确,
SortColumns或者SortRows一般是在某些事件中调用,才会对画面进行再排序。
也就是说,没有办法只在画面加载时通过一些设置达到每次点击都按照指定列排序,
而需要在某些事件,例如点击Spread列头时调用SortColumns或者SortRows进行排序?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-10-13 18:13:00
6#
回复 5楼xue5ya的帖子

请通过以下代码实现:

  1.         public Form1()
  2.         {
  3.             InitializeComponent();
  4.             this.fpSpread1.Sheets[0].Columns[3].AllowAutoSort = true;
  5.             this.fpSpread1.AutoSortingColumn += fpSpread1_AutoSortingColumn;


  6.         }

  7.         void fpSpread1_AutoSortingColumn(object sender, FarPoint.Win.Spread.AutoSortingColumnEventArgs e)
  8.         {
  9.             e.Cancel = true;
  10.             //以下为排序代码
  11.         }
复制代码
回复 使用道具 举报
xue5ya
中级会员   /  发表于:2014-10-14 10:01:00
7#
回复 6楼iceman的帖子

根据提供的方案尝试做了一下,虽然在加载的时候实现了排序,但是排序的规则固定住了。排序代码如下:

  1. FarPoint.Win.Spread.SortInfo[] sorter = new FarPoint.Win.Spread.SortInfo[5];
  2. sorter[0] = new FarPoint.Win.Spread.SortInfo(2, true);
  3. sorter[1] = new FarPoint.Win.Spread.SortInfo(1, true);
  4. sorter[2] = new FarPoint.Win.Spread.SortInfo(0, true);
  5. sorter[3] = new FarPoint.Win.Spread.SortInfo(3, true);
  6. sorter[4] = new FarPoint.Win.Spread.SortInfo(4, true);
  7. fpspdX.ActiveSheet.SortRows(0, fpspdX.ActiveSheet.RowCount, sorter);
复制代码

点击spread的列头时,始终是从第一列到第五列进行升序排列。而无法实现点击第三列,第三列优先排序,然后再参考第一列,第二列,第四列,第五列进行排序这种效果。是不是我的理解出现了偏差?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-10-14 18:45:00
8#
回复 7楼xue5ya的帖子

设置 sorter 的顺序既可以设置排序优先级,我这边通过你的代码实现了先按照 Column[3] 排序,再按照 Column[2] 排序。
13964.zip (64.7 KB, 下载次数: 1015)
回复 使用道具 举报
xue5ya
中级会员   /  发表于:2014-10-17 08:27:00
9#
回复 8楼iceman的帖子

首先感谢你的帮助,
尝试运行了一下代码,sorter的顺序确实可以设置排序的优先级。
但是顺序一旦确定,始终是按照这个顺序来进行排序,无法实现spread自身那种点哪一列按照哪一列最优先的效果。另外就是,点击一下列头排序后(比如升序),再点击一次列头仍然是升序排列,而不是Spread自身那种点击一次是升序,再点击一次是降序的效果。
自己的感觉是,要实现这种点击哪列哪列优先排序,再从左到右依次按照其他列排,而且第二次点击相同的列头,可以实现升序降序翻转的效果,需要和cellClick事件结合,动态的调整sorter的顺序和升序降序的属性,然后进行重新加载。
不知道想法是否正确,还有没有什么更好的方法?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2014-10-17 12:04:00
10#
回复 9楼xue5ya的帖子

您的思路是正确的,通过cellclick触发,执行不同的 SortInfo 来模拟这个动作。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部