主题:关于表格控件中数据的排序
shijier
[专家分:60] 发布于 2006-03-24 16:46:00
怎么可以使表格控件中的数据按所单击的列标头排序(即当单击某列的列标头时,表格中的数据按该列数据进行排序)。现在的问题是用什么事件去触发那段程序最好。
注:我不想用每列的HEADER1的CLICK事件触发,因为我的表格每次运行时的列数都可能不同。
回复列表 (共20个回复)
沙发
lwh1188 [专家分:25840] 发布于 2006-03-24 17:06:00
表格总与表相绑定吧?根据表字段去得“列数”和“列标题”,再设置多个有关“标题”的变量,点击就使变量改变,根据变量去作排序试试,这只是个设想,具体还没有试验过!
板凳
shijier [专家分:60] 发布于 2006-03-24 17:21:00
表格数据源是一个临时表,你说的这个办法有点不明白
3 楼
lwh1188 [专家分:25840] 发布于 2006-03-24 17:41:00
临时表与表格在表格中显示后就是与表格绑定了,字段及字段数也就定下来了,只要检测第1.2.3...n 等各个字段取得字段名,就基本可知表格的标题名,临时表一般不另指定字段标题名的,字段名与标题是同名的!要动态判断确实有点难!想好就靠诉你啦!
4 楼
shijier [专家分:60] 发布于 2006-03-24 22:27:00
按你的意思那也要为每个HEADER1写一个事件啊,我要的是只要写一个代码段,单击每个列标头就触发这段代码。
我等你的好消息
5 楼
可怜的香蕉 [专家分:0] 发布于 2006-03-24 22:39:00
楼上的两为大虾,可不可以也帮我解决个小小的问题!
谢~~
6 楼
labxj0769 [专家分:21070] 发布于 2006-03-24 23:25:00
GRID动态添加点表头的排序方法:
新建myheader.prg:
DEFINE CLASS NewHeader as Header
Name="NewHeader"
PROCEDURE click
oGrd=This.Parent.Parent
nColumns=This.Parent.ColumnOrder
Thisform.LockScreen= .T. &&锁定屏
cFileName=oGrd.RecordSource &&取得绑定的数据源名
IF !EMPTY(cFileName)
IF RECCOUNT('&cFileName')>0
FOR i=1 TO This.Parent.Parent.ColumnCount
cField=This.Parent.ControlSource &&取得绑定的字段名
SELECT (cFileName)
IF INLIST(VARTYPE(&cField),"C","N","D","T","Y","L") &&判断字段数据类型
IF i=nColumns && 点击的GRID头
cCap=ALLTRIM(This.Caption)
DO CASE
CASE AT('▽',cCap)>0
This.Caption=STRTRAN(cCap,'▽','△')
SELECT &cFileName
INDEX on &cField TO gIdx
SET ORDER TO gIdx ASCENDING
CASE AT('△',cCap)>0
This.Caption=STRTRAN(cCap,'△','▽')
SELECT &cFileName
INDEX on &cField TO gIdx
SET ORDER TO gIdx DESCENDING
OTHERWISE
This.Caption=This.Caption+SPACE(1)+'▽'
SELECT &cFileName
INDEX on &cField TO gIdx
SET ORDER TO gIdx DESCENDING
ENDCASE
ELSE && 没有点击的GRID头
cCap=ALLTRIM(oGrd.Columns(i).Header1.Caption)
DO CASE
CASE AT('▽',cCap)>0
oGrd.Columns(i).Header1.Caption=STRTRAN(cCap,'▽','')
CASE AT('△',cCap)>0
oGrd.Columns(i).Header1.Caption=STRTRAN(cCap,'△','')
OTHERWISE
***不变
ENDCASE
ENDIF &&&& 结束点击的GRID头判断
ENDIF &&结束字段数据类型判断
ENDFOR &&结束
ENDIF
ENDIF
SELECT (cFileName)
GO TOP
Thisform.LockScreen= .F. &&解锁屏
oGrd.Refresh
ENDPROC
ENDDEFINE
7 楼
labxj0769 [专家分:21070] 发布于 2006-03-24 23:25:00
**********************************************************
动态添加方法,我放在GRID的init:
*****动态添加排序
IF Thisform.grid1.ColumnCount>0
FOR i=1 TO Thisform.grid1.ColumnCount
WITH Thisform.grid1.Columns(i)
cCpation=.Header1.Caption
nFornts=.Header1.Fontsize
.RemoveObject('Header1') &&移除Header1
.Newobject("NewHeader1","NewHeader","myHeader.prg") &&根据PRG中声明类增加
.NewHeader1.Caption=cCpation
.NewHeader1.Fontsize=nFornts
.NewHeader1.Name='Header1' &&改回默认,对应PRG。如不改就同时改PRG
ENDWITH
ENDFOR
Thisform.grid1.Refresh
ENDIF
8 楼
wangluo88888 [专家分:0] 发布于 2006-04-12 18:36:00
专家就是专家,我按照专家的做了以后在确实是可行,但是在我这里有这样一个问题:我的表格数据源是来自一个临时表,我用搜索按钮来显示内容,第一次搜索时点击列标题可以排序,但是我再次搜索时,点击排序就没有任何反应了,请问这个该怎么办呢????迫切期待中。。。。。。[em14][em14][em14]
10 楼
hzc2 [专家分:390] 发布于 2006-04-13 22:07:00
请你把放在GRID的init的代码,放在你的搜索按钮的代码后面就行了。
我来回复