| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2981 人关注过本帖
标题:关于grid的问题
只看楼主 加入收藏
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
以下是引用liuxingang28在2016-3-14 16:57:16的发言:

针对第二个问题,解决方案如下:

修改 MyProc.prg,在 THISFORM.Refresh 之后添加一行:THIS.Parent.SetFocus

有点小问题,能定位到列了,但行记录,将会跳来跳去
是要把THIS.Parent.SetFocus放在GO TOP的上面
THIS.Parent.SetFocus
GO TOP
THISFORM.Refresh

[此贴子已经被作者于2016-3-14 17:09编辑过]

2016-03-14 17:06
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
收藏
得分:0 
以下是引用mywisdom88在2016-3-14 17:06:52的发言:


有点小问题,能定位到列了,但行记录,将会跳来跳去
是要把THIS.Parent.SetFocus放在GO TOP的上面
THIS.Parent.SetFocus
GO TOP
THISFORM.Refresh

我好像发现有乱七八糟的情况出现了,试试你说的!

2016-03-15 08:10
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
我的原话是:“在 THISFORM.Refresh 之后添加一行:THIS.Parent.SetFocus”,修改后的完整代码如下:

DEFINE CLASS MyHeader as Header
    name = 'Header1'
    PROCEDURE Click
        LOCAL nSelect,cFldName,cAlias,nNum_Tag
        cAlias = JUSTFNAME(THIS.Parent.ControlSource)    && 表名
        cFldName = JUSTEXT(THIS.Parent.ControlSource)    && 字段名
        cOldPict = JUSTSTEM(THIS.Picture)        && 当前图片
        THIS.Parent.Parent.SetAll('Picture','')        && 先去除所有图片
        nSelect = SELECT()
        SELECT (cAlias)
        nNum_Tag = ATAGINFO(aTag)
        DO CASE
        CASE ATC('up',cOldPict) > 0                && 升序时降序
            THIS.Picture = 'dowm.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0 && 若索引标记存在,则激活之
               SET ORDER TO &cFldName DESCENDING
            ELSE
                INDEX ON &cFldName TAG (cFldName) DESCENDING   && 索引标记不存在,新建之
            ENDIF
        CASE ATC('down',cOldPict) > 0            && 降序时无序
            SET ORDER TO
        OTHERWISE                                && 无序时升序
            THIS.Picture = 'up.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0
                SET ORDER TO &cFldName
            ELSE
                INDEX ON &cFldName TAG (cFldName)
            ENDIF
        ENDCASE
        lFlag = .f.
        SCAN
            REPLACE flag WITH lFlag
            lFlag = !lFlag
        ENDSCAN
        GO TOP
        THISFORM.Refresh
        THIS.Parent.SetFocus

        SELECT (nSelect)
    ENDPROC
ENDDEFINE

行记录不是“跳来跳去”,每次单击列标题后跳转到“第一条”记录,这也是大多数人的需要。如果你想单击列标题后保留原记录,也很简单,代码稍作修改如下:
DEFINE CLASS MyHeader as Header
    name = 'Header1'
    PROCEDURE Click
        LOCAL nSelect,cFldName,cAlias,nNum_Tag
        cAlias = JUSTFNAME(THIS.Parent.ControlSource)    && 表名
        cFldName = JUSTEXT(THIS.Parent.ControlSource)    && 字段名
        cOldPict = JUSTSTEM(THIS.Picture)        && 当前图片
        THIS.Parent.Parent.SetAll('Picture','')        && 先去除所有图片
        nSelect = SELECT()
        SELECT (cAlias)
        nRec = IIF(EOF(),0,RECNO())
        nNum_Tag = ATAGINFO(aTag)
        DO CASE
        CASE ATC('up',cOldPict) > 0                && 升序时降序
            THIS.Picture = 'dowm.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0 && 若索引标记存在,则激活之
               SET ORDER TO &cFldName DESCENDING
            ELSE
                INDEX ON &cFldName TAG (cFldName) DESCENDING   && 索引标记不存在,新建之
            ENDIF
        CASE ATC('down',cOldPict) > 0            && 降序时无序
            SET ORDER TO
        OTHERWISE                                && 无序时升序
            THIS.Picture = 'up.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0
                SET ORDER TO &cFldName
            ELSE
                INDEX ON &cFldName TAG (cFldName)
            ENDIF
        ENDCASE
        lFlag = .f.
        SCAN
            REPLACE flag WITH lFlag
            lFlag = !lFlag
        ENDSCAN
*        GO TOP
        IF nRec # 0
           GO nRec
        ENDIF

        THISFORM.Refresh
        THIS.Parent.SetFocus
        SELECT (nSelect)
    ENDPROC
ENDDEFINE

“师父领进门,修行在个人”。如果自己没有独立思考能力,单靠他人指导是不行的。

泉城飞狐
2016-03-15 08:48
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
收藏
得分:0 
以下是引用liuxingang28在2016-3-15 08:48:50的发言:

我的原话是:“在 THISFORM.Refresh 之后添加一行:THIS.Parent.SetFocus”,修改后的完整代码如下:

DEFINE CLASS MyHeader as Header
    name = 'Header1'
    PROCEDURE Click
        LOCAL nSelect,cFldName,cAlias,nNum_Tag
        cAlias = JUSTFNAME(THIS.Parent.ControlSource)    && 表名
        cFldName = JUSTEXT(THIS.Parent.ControlSource)    && 字段名
        cOldPict = JUSTSTEM(THIS.Picture)        && 当前图片
        THIS.Parent.Parent.SetAll('Picture','')        && 先去除所有图片
        nSelect = SELECT()
        SELECT (cAlias)
        nNum_Tag = ATAGINFO(aTag)
        DO CASE
        CASE ATC('up',cOldPict) > 0                && 升序时降序
            THIS.Picture = 'dowm.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0 && 若索引标记存在,则激活之
               SET ORDER TO &cFldName DESCENDING
            ELSE
                INDEX ON &cFldName TAG (cFldName) DESCENDING   && 索引标记不存在,新建之
            ENDIF
        CASE ATC('down',cOldPict) > 0            && 降序时无序
            SET ORDER TO
        OTHERWISE                                && 无序时升序
            THIS.Picture = 'up.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0
                SET ORDER TO &cFldName
            ELSE
                INDEX ON &cFldName TAG (cFldName)
            ENDIF
        ENDCASE
        lFlag = .f.
        SCAN
            REPLACE flag WITH lFlag
            lFlag = !lFlag
        ENDSCAN
        GO TOP
        THISFORM.Refresh
        THIS.Parent.SetFocus

        SELECT (nSelect)
    ENDPROC
ENDDEFINE

行记录不是“跳来跳去”,每次单击列标题后跳转到“第一条”记录,这也是大多数人的需要。如果你想单击列标题后保留原记录,也很简单,代码稍作修改如下:
DEFINE CLASS MyHeader as Header
    name = 'Header1'
    PROCEDURE Click
        LOCAL nSelect,cFldName,cAlias,nNum_Tag
        cAlias = JUSTFNAME(THIS.Parent.ControlSource)    && 表名
        cFldName = JUSTEXT(THIS.Parent.ControlSource)    && 字段名
        cOldPict = JUSTSTEM(THIS.Picture)        && 当前图片
        THIS.Parent.Parent.SetAll('Picture','')        && 先去除所有图片
        nSelect = SELECT()
        SELECT (cAlias)
        nRec = IIF(EOF(),0,RECNO())
        nNum_Tag = ATAGINFO(aTag)
        DO CASE
        CASE ATC('up',cOldPict) > 0                && 升序时降序
            THIS.Picture = 'dowm.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0 && 若索引标记存在,则激活之
               SET ORDER TO &cFldName DESCENDING
            ELSE
                INDEX ON &cFldName TAG (cFldName) DESCENDING   && 索引标记不存在,新建之
            ENDIF
        CASE ATC('down',cOldPict) > 0            && 降序时无序
            SET ORDER TO
        OTHERWISE                                && 无序时升序
            THIS.Picture = 'up.bmp'
            IF nNum_Tag > 0 AND ASCAN(aTag,cFldName,-1,-1,1,7) > 0
                SET ORDER TO &cFldName
            ELSE
                INDEX ON &cFldName TAG (cFldName)
            ENDIF
        ENDCASE
        lFlag = .f.
        SCAN
            REPLACE flag WITH lFlag
            lFlag = !lFlag
        ENDSCAN
*        GO TOP
        IF nRec # 0
           GO nRec
        ENDIF
        THISFORM.Refresh
        THIS.Parent.SetFocus
        SELECT (nSelect)
    ENDPROC
ENDDEFINE

“师父领进门,修行在个人”。如果自己没有独立思考能力,单靠他人指导是不行的。


我一直在测试,偶尔会出现第一行双行问题,一直没有找到原因,我尝试每次都把索引删除,然后重建,现在测试未出现问题!

2016-03-16 10:46
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
奇偶行问题也可以用 GRID 的 ActiveRow 属性来处理,这个与表物理记录顺序无关。
2016-03-16 11:41
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
回复 15楼 吹水佬
我也曾使用过ActiveRow,代码是:This.SetAll("DynamicBackColor","IIF(MOD(this.activerow,2)=0,RGB(255,255,255),RGB(192,192,192))","Column")

当使用鼠标滚轮或滚动条向下滚动记录时,奇偶行并未分色显示,分别单击各行时才分色显示。虽经努力,始终未解决此问题,不知吹版主有何高招?

而采用我的方法:为表新增 Flag 字段,根据该字段来分色显示却没有任何问题。

泉城飞狐
2016-03-16 16:05
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
回复 14 楼问题:

关于有些行颜色显示错乱,这不是我提供的代码有问题,而是你的初始索引文件有问题,需要 Reindex。因为在我的代码中,若该字段已建立了索引,则直接激活该索引,并没有重新建立。

[此贴子已经被作者于2016-3-16 16:10编辑过]


泉城飞狐
2016-03-16 16:09
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用liuxingang28在2016-3-16 16:05:27的发言:

我也曾使用过ActiveRow,代码是:This.SetAll("DynamicBackColor","IIF(MOD(this.activerow,2)=0,RGB(255,255,255),RGB(192,192,192))","Column")

当使用鼠标滚轮或滚动条向下滚动记录时,奇偶行并未分色显示,分别单击各行时才分色显示。虽经努力,始终未解决此问题,不知吹版主有何高招?

而采用我的方法:为表新增 Flag 字段,根据该字段来分色显示却没有任何问题。

因为当GRID不具有焦点或访问表格显示之外的行时 ActiveRow 为 0,所以当滚动时要重新使GRID具有焦点。

但GRID的滚动事件Scrolled也有点特别,不能在Scrolled事件中出现等待状态,VFP帮助说的是因为当滚动时会出现屏幕刷新问题。

当Scrolled事件中执行Grid.SetFocus,用鼠标滚轮滚动正常,但点击或拖动滚动条就不行。

尝试:在Scrolled事件中通过发送用异步消息触发自定义方法(GridSetFocus)执行Grid.SetFocus。

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG

CREATE CURSOR tt (F1 I, F2 C(10))
FOR i = 1 TO 20
    INSERT INTO tt VALUES (i%2, PADL(i,4,"0")) 
ENDFOR
GO TOP

of = CREATEOBJECT("form1")
of.Show
READ EVENTS
CLEAR DLLS
RETURN

DEFINE CLASS form1 As Form
    ADD OBJECT cmd1 as commandbutton WITH top=8,left=10,caption="SORT"
    Add Object Grid1 As Grid WITH top=30
        
    PROCEDURE UnLoad
        CLEAR EVENTS
    ENDPROC

    PROCEDURE Init
        BINDEVENT(this.hWnd, 0x401, this, "GridSetFocus")
        this.Grid1.SetFocus
    ENDPROC
    
    PROCEDURE cmd1.Click
        DELETE TAG ALL 
        INDEX on F2 TAG tt_F2 DESCENDING 
        thisform.Grid1.SetFocus
    ENDPROC
    
    PROCEDURE Grid1.Init
        this.SetAll("DynamicBackColor", "IIF(MOD(this.ActiveRow,2)==0, 0xFFFFFF, 0xC0C0C0)", "Column")
    ENDPROC

    PROCEDURE Grid1.Scrolled(nDirection)
        DOEVENTS
        PostMessage(thisform.hWnd, 0x401, 0, 0)
    ENDPROC
    
    FUNCTION GridSetFocus(hWnd, nMsg, wParam, lParam)
        this.Grid1.SetFocus
    ENDPROC
ENDDEFINE






[此贴子已经被作者于2016-3-16 16:53编辑过]

2016-03-16 16:51
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
回复 18楼 吹水佬
不错,经测试确实可行!

泉城飞狐
2016-03-17 08:02
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
收藏
得分:0 
以下是引用liuxingang28在2016-3-16 16:09:26的发言:

回复 14 楼问题:

关于有些行颜色显示错乱,这不是我提供的代码有问题,而是你的初始索引文件有问题,需要 Reindex。因为在我的代码中,若该字段已建立了索引,则直接激活该索引,并没有重新建立。



所以,我每次关闭grid就删除索引,这样就解决问题啦!

2016-03-17 09:12
快速回复:关于grid的问题
数据加载中...
 
   



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

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