DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jeff1314
今日帖子: 14
在线用户: 13
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2024/2/28 16:51:45
标题:
DBGridEh在点击标题排序后,如何用代码取消排序? 浏览:827
加入我的收藏
楼主: 如题,目前点击标题是可以排序的(SortLocal=True),
但没有办法取消排序,ClearSortMarkers方法好像只能去除标题上的标记,数据还是排序的.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/2/28 22:17:19
1楼: 概念:DBGrid 和 DBGridEh 这种 Delphi 的数据敏感控件,它不包含数据,它仅仅显示数据。

因此,排序这种事情,你看到的只是它的显示。实际上是 DataSet 里面对数据排序的。在 DataSet 里面已经排序的数据,没办法恢复到排序之前的状态。

你的问题是:为啥要【取消排序】?

我猜你是想恢复排序之前的数据排序状态。如果你原本的数据排序状态本身是混乱的,你恢复这样的混乱状态,对于使用来说,没有意义。

所以,这种排序,你实际上需要的,是换另外一种排序。简单说,你现在是根据名字排序,你可能想要换成根据年龄排序。从实际使用来说,你恢复排序之前的混乱状态,没有意义。
----------------------------------------------
-
作者:
男 guth (落叶) ★☆☆☆☆ -
普通会员
2024/2/29 9:22:32
2楼: 刷新一次数据不就恢复之前的状态了吗?
----------------------------------------------
-
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2024/2/29 10:42:14
3楼: 楼上两位,我是想恢复原生的从数据库中取回的数据状态,但dbgrideh在用户点击了列排列后,重新查询显示,还是会按之前的表格排序,没法取消,[除非关闭程序,重新运行,或者按下Ctrl选中列可以取消某列排序,用户觉得麻烦]
就是想找方法用代码取消表格的自动排序,在重新查询后.
[先去研究下它的源码先.]
像gridBrowse.SortMarkedColumns.Clear;等均不生效,得研究下.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 onlykingqc (simon) ★☆☆☆☆ -
普通会员
2024/2/29 12:02:00
4楼: 你没明白排序原理,如果初始化的数据是无序的,
你排序后是不可恢复的,除非ehgrid 保存了排序前的缓存 所以可以恢复
当然我对这个是持怀疑态度的。你的所谓ctrl后取消排列 我认为只是换了个排序方式吧,不可能是之前的无效排序,我是做grid的 假设数据有100w条,这个缓存排序成本太大了,也没有多大用处,还不如重载呢
----------------------------------------------
-
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2024/2/29 17:08:30
5楼: 楼上,我想我应该明白排序原理,呵呵.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2024/2/29 17:09:55
6楼: 大伙可以实际用一下DBGridEh,我其实只想找一个方法实现取消排序
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/3/1 0:21:11
7楼: 我前面打字那么多算是白打了。你还是在那里说 DBGridEh;

这个事情和 DBGridEh 一点关系都没有。再一次说:排序是它对应的 DataSet 里面做的。

如果你实在想要这个功能,有一个办法:使用 ClientDataSet 作为它的 DataSet;

ClientDataSet 有一个克隆功能。也有一个复制数据的功能。你排序前,先克隆数据到另外一个 ClientDataSet,排序后想恢复的话,从那个 ClientDataSet 克隆回来。

使用 FdMemTable 可能也有类似效果。
----------------------------------------------
-
作者:
男 wwzjx123 (ww zjx) ★☆☆☆☆ -
普通会员
2024/3/1 13:25:31
8楼: DBGridEh1.SortMarkedColumns.Clear;  // 取消排序
DBGridEh1.DefaultApplySorting;
----------------------------------------------
SPAM
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/3/1 13:38:08
9楼: 我做了一个实验,使用 ClientDataSet;

ClientDataSet1.IndexFieldNames := 'MySN'; 

使用上述代码,也就设置了它的排序。此时确实可以从 DBGrid 里面看到排序;

然后:

ClientDataSet1.IndexFieldNames := '';
使用上述代码,取消了排序。确实可以从 DBGrid 里面,看到记录的排序恢复成了排序之前的顺序。
----------------------------------------------
-
作者:
男 guth (落叶) ★☆☆☆☆ -
普通会员
2024/3/1 17:02:03
10楼: 查询出来的数据本来是乱序的,或者说是数据库的排序,点击标题排序后,再查询一次,就恢复初始查询的乱序了,D12lite+sqlserver测试没有问题。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/3/1 19:24:10
11楼: 10楼:你的做法,就是 DataSet 重新加载了数据。如果重新加载数据很耗时,那就不划算了。如果不耗时,也是一个解决需求的办法。

如果用 ClientDataSet 那就仅仅是在内存里面对数据进行排序,不涉及重新加载数据。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/3/1 21:13:47
12楼: 8楼,你的代码我测试了,没有楼主想要的效果。

我做了一个测试程序,使用了 ClientDataSet 和 DBGridEh,做了点 Title 排序的功能。然后:

procedure TForm1.Button3Click(Sender: TObject);
begin
  ShowMessage(ClientDataSet1.IndexFieldNames);

  ShowMessage(ClientDataSet1.IndexName);
end;

运行上述代码会发现,ClientDataSet1 默认是没有 IndexFieldNames 和 IndexName 的。但是,当点击了 Title 发现 Grid 里面的记录确实排序了以后,上述代码会发现,ClientDataSet1.IndexName 是:SortIndexEh;

说明,点击 DBGridEh 的抬头,让它排序,实际上它是给了 ClientDataSet1 增加了一个 Index 对象,类似在设计期给 ClientDataSet1 的 IndexDefs 属性里面增加一个索引对象。

因此,在这种情况下,我用这行代码:

procedure TForm1.Button4Click(Sender: TObject);
begin
//  DBGridEh1.SortMarkedColumns.Clear;
//  DBGridEh1.DefaultApplySorting;      这样做没有意义。

  ClientDataSet1.IndexName := '';
end;

当点了 DBGridEh 的抬头,看见它排序了,然后点上述按钮,执行 ClientDataSet1.IndexName := ''; 这句话,马上可以看到记录的顺序恢复成了没排序的时候的样子。

结论:DBGridEh 的排序,其实是它调用了它的 DataSet 来做的排序。

----------
又及,请参考这段话:

“EhLib已经实现了能在TQuery, TADOQuery 和TClientDataSet对象中排序数据的类。简单地通过 uses 子句添加 Ehlib...(EhlibBDE,EhlibADO,EhlibCDS)的单元之一到你的工程的任意单元中,与它们相连的数据网格将自动对该数据集进行排序。 EhLibBDE, EhLibADO, EhLibCDS 通过在单元数据集中调用 RegisterDatasetFeaturesEh 过程来实现初始化。
“对于其它数据集类型,你必须编写、并注册可以实现该数据集排序的新对象。书写过程 T[你的数据集]DatasetFeaturesEh.ApplySorting ,你可以存取那些使用了 SortMarkedColumns 属性的列以实现直接排序。你可以查看 DbUtilsEh 单元中的示例以明白如何编写T[你的数据集]DatasetFeaturesEh 类及查看 EhLibBDE 单元以明白如何注册 T[你的数据集]DatasetFeaturesEh 类。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/3/1 21:54:26
13楼: 写了一篇博客

https://blog.csdn.net/pcplayer/article/details/136406154
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/3/1 21:57:42
14楼: 3 楼的问题其实就好理解了:

3 楼的问题是:点了排序之后,重新从数据库获取数据,它还是排序的,而不是没排序的状态。

为啥?因为你点了排序,就已经为那个 DataSet 增加了一个排序索引了 -- 它本来是没有的。因此你再次加载数据,它仍然会排序。
----------------------------------------------
-
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2024/3/2 21:50:49
15楼: 其实当天就在源码中找到方法了,忘记贴上来了,就是8楼的兄弟的方法,比较完美的方法:

gridBrowse.SortMarkedColumns.Clear; // 清除内部排序列列表
gridBrowse.ClearSortMarkers;        // 清除界面上的排序标记
gridBrowse.DefaultApplySorting;     // 应用排序

这样再次查询就会去除DbGridEh的排序影响.
感谢所有的关注与回帖者.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2024/3/3 8:59:51
16楼: 思维角度不同,个人理解在TDataSet上排序更直观
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2024/3/3 12:55:18
17楼: 楼上说的也有道理,本人也仅是简简单单问个问题,找到方法即可:)
因为用了DBGridEh,所以有特定的需求,在界面表格上用户是可以直观看到什么字符排序.

如果用TDataSet排序当然可以,也要想办法在界面上告诉用户当前的排序字段,异曲同工
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 guth (落叶) ★☆☆☆☆ -
普通会员
2024/3/4 10:48:02
18楼: select 后,dbgrideh按照数据表初始状态排序(假定为乱序)
点击标题排序
dbgrideh.datasource.dataset.clear 
再select 后,dbgrideh不就又按照原数据表排序(这不就是恢复乱序了吗)
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行74.21875毫秒 RSS