|
|
导航: |
论坛 -> 数据库专区
斑竹:liumazi,waterstone |
|
作者: |
|
2024/2/28 16:51:45 |
标题: |
DBGridEh在点击标题排序后,如何用代码取消排序? |
浏览:827 |
|
加入我的收藏 |
楼主: |
如题,目前点击标题是可以排序的(SortLocal=True), 但没有办法取消排序,ClearSortMarkers方法好像只能去除标题上的标记,数据还是排序的.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm |
作者: |
|
2024/2/28 22:17:19 |
1楼: |
概念:DBGrid 和 DBGridEh 这种 Delphi 的数据敏感控件,它不包含数据,它仅仅显示数据。
因此,排序这种事情,你看到的只是它的显示。实际上是 DataSet 里面对数据排序的。在 DataSet 里面已经排序的数据,没办法恢复到排序之前的状态。
你的问题是:为啥要【取消排序】?
我猜你是想恢复排序之前的数据排序状态。如果你原本的数据排序状态本身是混乱的,你恢复这样的混乱状态,对于使用来说,没有意义。
所以,这种排序,你实际上需要的,是换另外一种排序。简单说,你现在是根据名字排序,你可能想要换成根据年龄排序。从实际使用来说,你恢复排序之前的混乱状态,没有意义。
----------------------------------------------
-
|
作者: |
guth (落叶) |
★☆☆☆☆ |
-
|
普通会员 |
|
2024/2/29 9:22:32 |
2楼: |
刷新一次数据不就恢复之前的状态了吗?
----------------------------------------------
-
|
作者: |
|
2024/2/29 10:42:14 |
3楼: |
楼上两位,我是想恢复原生的从数据库中取回的数据状态,但dbgrideh在用户点击了列排列后,重新查询显示,还是会按之前的表格排序,没法取消,[除非关闭程序,重新运行,或者按下Ctrl选中列可以取消某列排序,用户觉得麻烦] 就是想找方法用代码取消表格的自动排序,在重新查询后. [先去研究下它的源码先.] 像gridBrowse.SortMarkedColumns.Clear;等均不生效,得研究下.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
|
作者: |
|
2024/2/29 12:02:00 |
4楼: |
你没明白排序原理,如果初始化的数据是无序的, 你排序后是不可恢复的,除非ehgrid 保存了排序前的缓存 所以可以恢复 当然我对这个是持怀疑态度的。你的所谓ctrl后取消排列 我认为只是换了个排序方式吧,不可能是之前的无效排序,我是做grid的 假设数据有100w条,这个缓存排序成本太大了,也没有多大用处,还不如重载呢
----------------------------------------------
-
|
作者: |
|
2024/2/29 17:08:30 |
5楼: |
楼上,我想我应该明白排序原理,呵呵.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
|
作者: |
|
2024/2/29 17:09:55 |
6楼: |
大伙可以实际用一下DBGridEh,我其实只想找一个方法实现取消排序
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
|
作者: |
|
2024/3/1 0:21:11 |
7楼: |
我前面打字那么多算是白打了。你还是在那里说 DBGridEh;
这个事情和 DBGridEh 一点关系都没有。再一次说:排序是它对应的 DataSet 里面做的。
如果你实在想要这个功能,有一个办法:使用 ClientDataSet 作为它的 DataSet;
ClientDataSet 有一个克隆功能。也有一个复制数据的功能。你排序前,先克隆数据到另外一个 ClientDataSet,排序后想恢复的话,从那个 ClientDataSet 克隆回来。
使用 FdMemTable 可能也有类似效果。
----------------------------------------------
-
|
作者: |
|
2024/3/1 13:25:31 |
8楼: |
DBGridEh1.SortMarkedColumns.Clear; // 取消排序 DBGridEh1.DefaultApplySorting;
----------------------------------------------
SPAM
|
作者: |
|
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测试没有问题。
----------------------------------------------
-
|
作者: |
|
2024/3/1 19:24:10 |
11楼: |
10楼:你的做法,就是 DataSet 重新加载了数据。如果重新加载数据很耗时,那就不划算了。如果不耗时,也是一个解决需求的办法。
如果用 ClientDataSet 那就仅仅是在内存里面对数据进行排序,不涉及重新加载数据。
----------------------------------------------
-
|
作者: |
|
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 类。
----------------------------------------------
-
|
作者: |
|
2024/3/1 21:57:42 |
14楼: |
3 楼的问题其实就好理解了:
3 楼的问题是:点了排序之后,重新从数据库获取数据,它还是排序的,而不是没排序的状态。
为啥?因为你点了排序,就已经为那个 DataSet 增加了一个排序索引了 -- 它本来是没有的。因此你再次加载数据,它仍然会排序。
----------------------------------------------
-
|
作者: |
|
2024/3/2 21:50:49 |
15楼: |
其实当天就在源码中找到方法了,忘记贴上来了,就是8楼的兄弟的方法,比较完美的方法:
gridBrowse.SortMarkedColumns.Clear; // 清除内部排序列列表 gridBrowse.ClearSortMarkers; // 清除界面上的排序标记 gridBrowse.DefaultApplySorting; // 应用排序
这样再次查询就会去除DbGridEh的排序影响. 感谢所有的关注与回帖者.
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
|
作者: |
|
2024/3/3 8:59:51 |
16楼: |
思维角度不同,个人理解在TDataSet上排序更直观
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier 缘在上海
|
作者: |
|
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不就又按照原数据表排序(这不就是恢复乱序了吗)
----------------------------------------------
-
|
|