回 帖 发 新 帖 刷新版面

主题:关于表格控件中数据的排序

怎么可以使表格控件中的数据按所单击的列标头排序(即当单击某列的列标头时,表格中的数据按该列数据进行排序)。现在的问题是用什么事件去触发那段程序最好。
注:我不想用每列的HEADER1的CLICK事件触发,因为我的表格每次运行时的列数都可能不同。

回复列表 (共20个回复)

沙发

表格总与表相绑定吧?根据表字段去得“列数”和“列标题”,再设置多个有关“标题”的变量,点击就使变量改变,根据变量去作排序试试,这只是个设想,具体还没有试验过!

板凳


表格数据源是一个临时表,你说的这个办法有点不明白

3 楼

临时表与表格在表格中显示后就是与表格绑定了,字段及字段数也就定下来了,只要检测第1.2.3...n 等各个字段取得字段名,就基本可知表格的标题名,临时表一般不另指定字段标题名的,字段名与标题是同名的!要动态判断确实有点难!想好就靠诉你啦!

4 楼

按你的意思那也要为每个HEADER1写一个事件啊,我要的是只要写一个代码段,单击每个列标头就触发这段代码。
我等你的好消息

5 楼

楼上的两为大虾,可不可以也帮我解决个小小的问题!
谢~~

6 楼

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 楼

**********************************************************
动态添加方法,我放在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 楼


专家就是专家,我按照专家的做了以后在确实是可行,但是在我这里有这样一个问题:我的表格数据源是来自一个临时表,我用搜索按钮来显示内容,第一次搜索时点击列标题可以排序,但是我再次搜索时,点击排序就没有任何反应了,请问这个该怎么办呢????迫切期待中。。。。。。[em14][em14][em14]

9 楼

不错,顶

10 楼

请你把放在GRID的init的代码,放在你的搜索按钮的代码后面就行了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册