标题:请教坛中大神一个关于grid表点击表头排序的问题
只看楼主
jinnee99
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-10-12
得分:0 
麻烦吹版再看下,十分感谢
我建立了个grid的类,把myclick和msortad的属性加在了grid里内,
因为表单上经常会并列显示多个数据表单,所以每个表单的数据源是
不确定的。
所以想请吹版打开程序看看。

**form.load
SELECT *from 客户名单 INTO CURSOR pzlsb1

**grid.myclick
LOCAL mSortCol[1],mCmd
IF (AEVENTS(mSortCol,0) > 0)  &&将对象赋值给数组变量
    IF (VARTYPE(mSortCol[1])=="O") AND (PROPER(mSortCol[1].BaseClass)=="Header")
       mField=(mSortCol[1].Parent.ControlSource)  &&取点击表头的Header
       mCursor=SUBSTR(mField,1,AT('.',mField)-1)  &&取临时表
       mField=SUBSTR(mField,AT('.',mField)+1)     &&取排序字段
       mCmd='select *from '+;
             mCursor+;
             ' order by '+;
             mField+;
             IIF(this.mSortAD, " ASC ", " DESC ") +;
             " INTO cursor "+mCursor
             MESSAGEBOX(mCmd)
       this.RecordSource = ""
       EXECSCRIPT(mCmd)
       this.RecordSource =mCursor
       this.SetFocus
       this.mSortAD = !this.mSortAD &&自定义表单属性mSortAD,升降序切换
    ENDIF
ENDIF

**grid.init
FOR EACH oColumn IN this.Columns
    BINDEVENT(oColumn.Header1, "Click", this, "myClick")
ENDFOR

[此贴子已经被作者于2018-3-14 15:31编辑过]

2018-03-14 15:24
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用mywisdom88在2018-3-14 14:54:48的发言:

吹版,在GRID的标题上用1个图片,显示当前的排序是向上还是向下的,怎么做.我以前看到有,忘了在哪里

Header对象有Picture属性,适时变换一下Picture应该可以。
2018-03-14 15:28
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 11楼 jinnee99
好象有点乱,看看下面几个地方的 mCursor 是否有冲突。
mCursor=SUBSTR(mField,1,AT('.',mField)-1) &&表格当前数据源别名
mCmd='select *from '+;
     mCursor+; &&从表格当前数据源取数据
......
     " INTO cursor "+mCursor &&生成的别名与表格当前数据源相同
......
this.RecordSource =mCursor &&好象没有改变


**grid.init
FOR EACH oColumn IN this.Columns
    BINDEVENT(oColumn.Header1, "Click", this, "myClick")
ENDFOR
在 grid.init 处理,如果 myClick 是在表单定义,要 thisform, "myClick"
BINDEVENT(oColumn.Header1, "Click", thisform, "myClick")

2018-03-14 15:48
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 11楼 jinnee99
看了一下提供的代码,是封装了一个mGrid类的。
在 mgrid.init 执行不到 BINDEVENT(oColumn.Header1, "Click", this, "myClick")。
因为 mgrid 没定义 Column 对象,且mgrid的init要比form的init先执行。
改了一下:
点击排序.rar (22.53 KB)
2018-03-14 16:11
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:1 
** thisform.myClick 自定义表单方法,点击表格各栏目排序
LOCAL aCol[3], cmd,img
IF (AEVENTS(aCol,0) > 0)
    IF (VARTYPE(aCol[1])=="O") AND (PROPER(aCol[1].BaseClass)=="Header")

       ** 当前列标题红色
       FOR EACH oColumn IN this.grid1.Columns
           oColumn.Header1.ForeColor=RGB(0,0,0)
       ENDFOR
       aCol[1].ForeColor =RGB(255,0,0)

       ** 升序 图片 up.bmp,降序 图片 down.bmp
       IF AT("up.bmp",lower(aCol[1].Picture)) > 0
          aCol[1].Picture = [G:\点头排序\down.bmp]
       ELSE
          aCol[1].Picture = [G:\点头排序\up.bmp]
       ENDIF

       cmd = "SELECT * FROM cp2013 ORDER BY " +;
            JUSTEXT(aCol[1].Parent.ControlSource) +;
            IIF(AT("up.bmp",lower(aCol[1].Picture))>0, " ASC ", " DESC ") +;
            "INTO CURSOR grid1_tmp"
            
        this.grid1.RecordSource = ""
        USE IN "grid1_tmp"
        EXECSCRIPT(cmd)
        this.grid1.RecordSource = "grid1_tmp"
        this.grid1.SetFocus
        this.Ascending = !this.Ascending &&自定义属性Ascending,升降序切换
        
    ENDIF
ENDIF
** thisform.Init
SELECT * FROM cp2013 INTO CURSOR grid1_tmp
this.grid1.recordsource = "grid1_tmp"
FOR EACH oColumn IN this.grid1.Columns
    BINDEVENT(oColumn.Header1, "Click", this, "myClick")
    oColumn.Header1.picture="down.bmp"
ENDFOR
2018-03-14 16:57
jinnee99
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-10-12
得分:0 
感谢吹版,也了解了在逻辑结构上的问题,
另再请教一个问题,
此方法改变了recordsourcetype的属性为“4-SQL说明”
如果这里仍采用“1-别名”的方式如何处理?做为数据源的临时表名能否用变量代替?


另:版主在上次回复中的注释,我是这么想的,因为只是改变了数据的排序,数据源没有发生变化,

所以习惯性的使用select *from 数据表 into cursor 临时表
需要排序时,select *from 临时表 order by 排序字段 into cursor 临时表


[此贴子已经被作者于2018-3-14 22:40编辑过]

2018-03-14 19:20
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 16楼 jinnee99
recordsourcetype = 1(1-别名)时,就象之前的示例刷新recordsource就是。

“另:版主在上次回复中的注释,我是这么想的,因为只是改变了数据的排序,数据源没有发生变化,”
不改变recordsource的话,也就是说GRID的数据源是保持不变的,可试试以下方法:
方法一,每次获取到排序后的表数据后,用ZAP清除数据源表再APPEND FROM (排序后的表)。
方法二,直接用INDEX ON ... TAG ... ASCENDING|DESCENDING。因要重建索引文件,这方法只适用表独占情况。
2018-03-14 19:55
jinnee99
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-10-12
得分:0 

改了吹版你发的第一稿(未封装类的)成功了,
但是采用封装Grid类的那版,试了好长时间,将recordsourcetype 改为= 1(1-别名)后,只响应第一次的click事件,后就再没反应了。
不知道是什么原因。
肯请吹大神改下代码。
因程序整体风格的原因,所以想延用类以及 select *from 数据源 order by 字段 into cursor 临时表
this.recordsource=lsbnamer(lsbname=临时表名)的方式。
万分感谢!!

[此贴子已经被作者于2018-3-14 22:54编辑过]

2018-03-14 22:38
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
还是用14楼的改为recordsourcetype=1
点击排序.rar (22.47 KB)


2018-03-14 23:23
jinnee99
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-10-12
得分:0 
厚着脸皮再来讨教吹版!
将19楼的程序中改动了一点,改动如下:
 cAlias = JUSTSTEM(mSortCol[1].Parent.ControlSource)
 cField = JUSTEXT(mSortCol[1].Parent.ControlSource)
 this.RecordSource = ""
 EXECSCRIPT("SELECT * FROM "+cAlias+" ORDER BY " + cField +;
            IIF(this.mSortAD, " ASC ", " DESC ") +;
            "INTO CURSOR " +  cAlias)
this.RecordSource =  cAlias
执行后报


先解释下为什么from的表和into cursor的表是同一个
现在改编的系统用的数据库是SQL,一般先通过sqlexec(联接字,sql语句,临时表)
的方式把数据拉到临时表中,再以临时表为基础进行大量的查询工作,
只有发生插入或修改的工作后,才重新执行sqlexec(联接字,sql语句,临时表),
因此程序中大量的运用了“select *from 临时表 order by 字段 into cursor 临时表”
的语句,没有报错过。并且如果不采用封装mGrid类的模式也可以正常执行。
现刚尝试使用封装类,哪知出了这么一个错,百思不得其解??
还有一点,封装类里定义了表头字段的背景,在没有bind动作前,风格是对的,但bind的语
句加入后,背景修饰不起作用了,见mClass.init事件。
由于程序表单中多会使用两至三个数据表格,因此采用不封装类的模式反而加大了工作量,
而采用了封装类,又被卡在了这个错误上。
所以特意向吹版请教!



[此贴子已经被作者于2018-3-15 08:59编辑过]

2018-03-15 08:39



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-485222-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.071834 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved