标题:请教坛中大神一个关于grid表点击表头排序的问题
取消只看楼主
jinnee99
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-10-12
结帖率:100%
已结贴  问题点数:20 回复次数:8 
请教坛中大神一个关于grid表点击表头排序的问题
小弟我VFP编程一直是自学,不专业不正规,半调子。
以前解决grid表单点击排序一直是先绑定数据源,然后编写各字段的header的click事决。
后偶尔看到一个用Bindevent()函数解决的方法,一直在尝试,但不成功,还请坛中大神
百忙之中伸手拉小弟一把~~~  :)
test.rar (2.75 KB)

这是程序
搜索更多相关主题的帖子: grid 点击 表头 排序 click 
2018-03-13 15:47
jinnee99
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-10-12
得分:0 
多谢两位大神,够我学习消化一阵子的了。
因为是野路子,所以这个解决的思路不能理解,还请两大神不要见笑~
2018-03-13 21:08
jinnee99
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-10-12
得分:0 
再次感谢,已经搞懂了~
2018-03-13 22:38
jinnee99
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-10-12
得分:0 
点击排序.rar (21.4 KB)

再请吹水大神看看,我按照大神给的代码变换了一下,但发生了一个错误,(临时表名)必须由select ...into table 创建
个人猜测:
错误应该是是this.RecordSource =mCursor产生的
因为默为的数据源是"别名",所以this.RecordSource =mCursor会认为是字段名
修改成
       mCmd="select *from "+mCursor+" order by "+mField+" into cursor "+mCursor
       this.recordsourcetype=4
       this.RecordSource =mCmd
      后倒是不报错了,但数据是空的
请教该如何解决

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

2018-03-14 12:50
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
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
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
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
jinnee99
Rank: 1
等 级:新手上路
帖 子:17
专家分:5
注 册:2013-10-12
得分:0 
报告吹版一个好消息,这个困扰我的问题已经成功解决了。
SELECT * FROM "+cAlias+" ......"INTO CURSOR " +  cAlias)
从 cAlias 到 cAlias 在vfp9.0下因sql标准化的问题不好用了。
但只要加上SET ENGINEBEHAVIOR 70还能用。
此问题类似group by。

再次感谢吹版以及所有提供帮助的朋友。
2018-03-15 13:58



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




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

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