方法1: (不用编程写代码)

程序中引用 单元 EhLibCDS
设置DBGridEh的属性:
      ColumnDefValues.Title.TitleButton = True
      OptionsEh = [ghAutoSortMarking, dghMultiSortMarking]
      SortLocal = True

参考:

以下翻译来自EhLib/DataService/readme.txt

“在 Ehlib 的 DataService 文件夹下提供了一些可以使数据集实现自动排序的文件。TDBGridEh 使用这些文件中的相关对象可以实现当排序标记发生变化时实现自动排序。
“如果你改变了数据网格及标题的排序标记而没有书写 OnSortMarkingChanged 事件,数据网格将尝试自动进行数据排序。
“DBGridEhDataService尝试通过 GetDatasetFeaturesForDataSet 查找 TDataSet 中可以排序的特定的对象。正如你所知道的,TDataSet 不支持数据排序,但它的派生对象 TQuery 或 TClientDataSet 却允许实现数据排序。

“使用过程 RegisterDatasetFeaturesEh ,你可以注册 TDatasetFeaturesEhClass 类对指定的数据集排序。

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

引擎 数据集 单元文件

BDE TQuery EhLibBDE

ADO TADOQuery EhLibADO

ClientDataSet TClientDataSet EhLibCDS

DBExpress TSQLQuery EhLibDBX

方法2:

在我的OnTitleClick事件中:
case Column.Title.SortMarker of
smNoneEh: Column.Title.SortMarker := smDownEh;
smDownEh: Column.Title.SortMarker := smUpEh;
smUpEh: Column.Title.SortMarker := smNoneEh;
end;

在我的OnSortMarkingChanged事件中:
ShowMessage('marker changed!'); //从来都没运行.Why???????
//添加Order By语句

我的DBGridEh属性页中,OptionsEh里设置:
dghautosortmarking=True;

请用过Ehlib2.1的高手指点一下:如何设置使OnSortMarkingChanged事件发生作用.
在Ehlib的Demo1里,没有设置OnTitleClick事件,不知为何也能排序?
set DBGridEh1.Column[i] TitleButton := True

dbgridEh有一个属性frozencols
你设为1,则你的第一列就固定了
设为2,前两列固定,依次。。。

procedure Tbranch_type_frm.dbg1TitleClick(Column: TColumnEh);
begin
if not (adoquery1.IsEmpty) then adoquery1.Sort:=Column.Field.FieldName;
end;
;//排序
第二个问题:Demo中没有对OnTitleClick编程,对OnTitleBtnClick编程已注释,如下:
{ case Column.Title.SortMarker of
smNoneEh: Column.Title.SortMarker := smDownEh;
smDownEh: Column.Title.SortMarker := smUpEh;
smUpEh: Column.Title.SortMarker := smNoneEh;
end;}
而且这段程序的作用只是控制排序显示的上下图标,不产生实际的排序郊果

我自己的解决方法:
procedure TForm1.DBGridEh1TitleClick(Column: TColumnEh);
var
i: Integer;
s: String;
FieldStr: String;
Oldsql,NewSql:String;
begin
LockWindowUpdate((self).Handle);
s := '';
i := Column.Index;
FieldStr := DBGridEh1.Columns[i].FieldName;;
if DBGridEh1.Columns[i].Title.SortMarker = smNoneEh then
begin
DBGridEh1.Columns[i].Title.SortMarker := smDownEh;
s := 'order by '+ FieldStr;
end
else
if DBGridEh1.Columns[i].Title.SortMarker = smDownEh then
begin
DBGridEh1.Columns[i].Title.SortMarker := smupEh;
s := 'order by '+ FieldStr + ' Desc';
end
else
begin
DBGridEh1.Columns[i].Title.SortMarker := smDownEh;
s := 'order by '+ FieldStr;
end;
OldSql := simpleDataSet1.DataSet.CommandText;
i := pos('order by ',OldSql);
if i <> 0 then
NewSql := copy(OldSql,0,i-1) + s
else
NewSql := OldSql + ' ' + s;
if NewSql <> OldSql then begin //如果不相等就开始
SimpleDataSet1.PacketRecords := 10;
SimpleDataSet1.Active := False;
SimpleDataSet1.DataSet.CommandText := NewSql;
SimpleDataSet1.Active := True;
end;
LockWindowUpdate(0);
end;

部分参数:
Flat: True xp风格
Options-dgRowSelect 选择一个则显示一行, (会将edit自动设为False)
字段的 DisplayFormat #,##0.00;-#,##0.00 格式化数字显示
CheckBoxes 设为checkbox控件状. 如果是integer形 则设Footer中的keylist和Picklist,一个是值一个是显示

DBGridEh 点击表头排序方法的更多相关文章

  1. CList 点击表头排序 (2)两种排序方法中其中一种

    上一篇讲解SortItem()方法如何使用,虽然都是抄别人的但是就是想让大家有个大概的了解 CList 点击表头排序 (1)SortItems函数 点击表头排序基本思路都是 1.首先响应HDN_ITE ...

  2. CList 点击表头排序 (3)两种排序的第二种

    在头两篇中介绍了CListCtrl::SortItems() 方法的使用和其中的一个排序方法,这篇介绍另一种方法 CList 点击表头排序 (1)SortItems函数 CList 点击表头排序 (2 ...

  3. CList 点击表头排序 (1)SortItems函数

    点击表头排序整体的思路都是去 CListCtrl类中的方法SortItems去实现 CListCtrl::SortItems的原型是: BOOL SortItems( PFNLVCOMPARE pfn ...

  4. GridView表头排序方法设置

    1.效果图 2.前台代码 说明:红色代码为核心代码 <asp:GridView ID="gvData" runat="server" AutoGenera ...

  5. swing jTable排序问题(点击表头排序)

    1.JDK6自带排序实现: tableName.setAutoCreateRowSorter(true); 2.其实界面设计中勾选一个属性就搞定了: .

  6. QT中Qtableview视图表格中点击表头进行排序

    用QT写了一个小工具,主要是对Excel中大量的数据进行计算和显示. 写了有一段时间,然后断断续续的做一些修改和完善. 因为要显示的数据有多列,很自然的会想到要能够对显示的数据进行排序.如果直接操作m ...

  7. javascript: 带分组数据的Table表头排序

    如下图: 要求:点击表头排序时,"分组"及"分组明细"的数据层次关系不变 从网上找了一段常规的table排序,改了改,以满足“分组支持”,贴在这里备份 < ...

  8. ElementUI - Table 表头排序

    ElementUI - Table 表头自带排序功能,和排序事件,但是目前只是对当前界面的数据进行排序. 项目需求: 点击表头排序的时候,对所有数据进行排序. 初步方案: 在点击排序按钮的时,在排序事 ...

  9. JS实现点击表头表格自动排序(含数字、字符串、日期)

    这篇文章主要介绍了利用JS如何实现点击表头后表格自动排序,其中包含数字排序.字符串排序以及日期格式的排序,文中给出了完整的示例代码,并做了注释,相信大家都能看懂,感兴趣的朋友们一起来看看吧. < ...

随机推荐

  1. 【原】Nginx添加Content-MD5头部压测分析

    如需转载,必须注明原文地址,请尊重作者劳动成果. http://www.cnblogs.com/lyongerr/p/5048464.html 本文介绍了webbenck安装,但是最后使用的是ab工具 ...

  2. Android双击Back退出应用

    前言 在app主界面点击back时,通常有以下几种方式进行退出 单击即退出 弹出确认Dialog 再次点击退出程序 个人最喜欢方式3,相比于方式2,不需要再把手指移动到屏幕中央点击Dialog,相比于 ...

  3. 《Head First 设计模式》ch.3 装饰(Decorator)模式

    设计原则 类应该对修改关闭,对扩展开放(开放-关闭原则).在每个地方使用开放-关闭原则是一种浪费,也没有必要,因为这通常会引入新的抽象层次,增加代码复杂度.需要把注意力集中在设计中最有可能改变的地方. ...

  4. windows常用运行命令收集(持续更新)

    快捷键打开运行窗口:Windows + R > calc(计算器) > gpedit.msc(本地组策略编辑器) > regedit(注册表) > mstsc(远程桌面) &g ...

  5. Unity协程(Coroutine)原理深入剖析(转载)

    记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield r ...

  6. 学习opencv跟轮廓相关的

    查找轮廓 轮廓到底是什么?一个轮廓一般对应一系列的点,也就是图像中的一条曲线.表示的方法可能根据不同情况而有所不同.有多重方法可以表示曲线.在openCV中一般用序列来存储轮廓信息.序列中的每一个元素 ...

  7. 学习总结 java 输入输出流

    思维导图 代码实际演示 package com.hanqi.io; import java.io.*; public class Test1 { public static void main(Str ...

  8. [JFinal 1] JFinal和SSH中使用拦截器的对比

    导读:先前在做.NET项目时,拦截的功能主要是依靠缓存session来实现.当需要跳转到某个页面,使用某个功能查询一些数据时,会根据session中的用户值来判断是否已经正常登录,如果没有,则重定向到 ...

  9. MFC六大核心机制之一:MFC程序的初始化

    很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下 ...

  10. ifdown eth0 && idup eth0 ifdown --exclude=l0 -a && ifup --exclude=lo -a