方法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. 记事本源代码 python3

    已实现基本功能,显示行号功能暂时实现不了(后面学会了再加,右下角可以实现定位光标所在行.列) 可能会有些bug 1 from tkinter import * from tkinter.message ...

  2. php mysql 中文乱码解决方法

    本文章向码农们介绍php mysql 中文乱码解决方法,对码农们非常实用,需要的码农可以参考一下. 从MySQL 4.1开始引入多语言的支持,但是用PHP插入的中文会出现乱码.无论用什么编码也不行 解 ...

  3. Android popupwindow 弹出的位置问题

    在Android开发中,需要用到PopupWindow这个类.在初始化完成,显示之前,都需要获得这个对象的width,height去计算popupWindow弹出的位置. 这个时候会发现取得的widt ...

  4. Flex4/Flash开发在线音乐播放器 , 含演示地址

    要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...

  5. 学习练习 Oracle数据库小题

    Course(课程表) Score(成绩表) Teacher(教师表)

  6. Oracle自增ID实现

    首先,创建一张表: CREATE TABLE example( ID Number(4) NOT NULL PRIMARY KEY, NAME VARCHAR(25)); 然后,自定义一个序列(seq ...

  7. Response.Write页面跳转

    一.<a>标签 <a href=”test.aspx”></a> 这是最常见的一种转向方法 二.HyperLink控件   1. Asp.net 服务器端控件 属性 ...

  8. prototype原型模式中的问题

    对于每个构造函数来说,都有一个prototype属性.对于每个对象实例来说,都有_proto_属性. 参看下面代码: function Person(){} Person.prototype={ na ...

  9. PC上安装MAC X Lion

    PC上安装MACXLion 网上关于如何在PC下安装MAC的文章已近不少了,但对于一些初学者在实践当中会遇到各种问题,以下视频资料为大家展示两种虚拟机安装MacOS. 1.VmwareWorkstat ...

  10. docker学习(二)

    1 镜像 docker使用联合加载技术,一次同时加载多个文件系统,在外面只能看到一个文件系统 docker使用写时复制,每个只读镜像层都是只读的,也永远不会发生变化,建立一个新容器,会构建一个镜像栈, ...