| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2387 人关注过本帖
标题:表单中grid 控件使用的问题,求指教
只看楼主 加入收藏
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
如果不是要求特定视觉效果,可以试试封装一个textbox作为grid的编辑控件,用grid的readonly来控制编辑
2022-09-08 07:41
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1090
专家分:2682
注 册:2015-12-30
收藏
得分:0 
以下是引用huowang在2022-9-7 17:26:01的发言:

那我想实现这个功能该怎么做呢


介绍一下我的做法:
grid的allowcellselecion=.F.,双击时改成.T.,afterrowcolchange 时把allowcellselecion改成.F.
这样做步骤上并没有减少,但有一个好处,就是可以防止操作者不小心输入了单元格内容

[此贴子已经被作者于2022-9-8 09:44编辑过]

2022-09-08 07:57
wj0216
Rank: 2
等 级:论坛游民
帖 子:8
专家分:12
注 册:2015-11-12
收藏
得分:4 


[此贴子已经被作者于2022-9-8 09:09编辑过]

2022-09-08 09:08
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 11楼 吹水佬
程序代码:
CREATE CURSOR tt (F1 C(10), F2 C(10), F3 I)
INSERT INTO tt VALUES ("ABC", "123456", 101)
INSERT INTO tt VALUES ("DEF", "654321", 202)
INSERT INTO tt VALUES ("GHI", "456123", 303)
GO TOP 
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 as Form
    ADD OBJECT grid1 as myGrid
ENDDEFINE

DEFINE CLASS myGrid as Grid 
    ReadOnly = .t.
    PROCEDURE Init
        FOR EACH oCol IN this.Columns
            IF oCol.CurrentControl=="Text1"
                oCol.RemoveObject("Text1")
                oCol.AddObject("Text1","myTextbox",this)
            ENDIF 
        ENDFOR 
    ENDPROC 
ENDDEFINE

DEFINE CLASS myTextbox as TextBox 
    Visible = .t.
    grid = NULL
    PROCEDURE Init(grid)
        this.grid = grid
    ENDPROC 
    PROCEDURE DblClick
        this.grid.ReadOnly = .f.
    ENDPROC 
    PROCEDURE LostFocus
        this.grid.ReadOnly = .t.
    ENDPROC 
ENDDEFINE
2022-09-08 10:35
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:790
专家分:1170
注 册:2021-10-13
收藏
得分:0 
以下是引用吹水佬在2022-9-8 10:35:32的发言:

CREATE CURSOR tt (F1 C(10), F2 C(10), F3 I)
INSERT INTO tt VALUES ("ABC", "123456", 101)
INSERT INTO tt VALUES ("DEF", "654321", 202)
INSERT INTO tt VALUES ("GHI", "456123", 303)
GO TOP
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 as Form
    ADD OBJECT grid1 as myGrid
ENDDEFINE

DEFINE CLASS myGrid as Grid
    ReadOnly = .t.
    PROCEDURE Init
        FOR EACH oCol IN this.Columns
            IF oCol.CurrentControl=="Text1"
                oCol.RemoveObject("Text1")
                oCol.AddObject("Text1","myTextbox",this)
            ENDIF
        ENDFOR
    ENDPROC
ENDDEFINE

DEFINE CLASS myTextbox as TextBox
    Visible = .t.
    grid = NULL
    PROCEDURE Init(grid)
        this.grid = grid
    ENDPROC
    PROCEDURE DblClick
        this.grid.ReadOnly = .f.
    ENDPROC
    PROCEDURE LostFocus
        this.grid.ReadOnly = .t.
    ENDPROC
ENDDEFINE


2022-09-08 10:57
huowang
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2019-5-17
收藏
得分:0 
感谢大家的指点,真心感谢
2022-09-08 11:27
huowang
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2019-5-17
收藏
得分:0 
以下是引用csyx在2022-9-7 21:22:38的发言:

开打调试器的事件跟踪可以看到,Before/AfterRowColChange事件是在click事件之前触发的,所以第一次会无效

有办法解决吗
2022-09-08 11:34
huowang
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2019-5-17
收藏
得分:0 
知道问题出在那了,走了弯路的
2022-09-08 12:28
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:708
专家分:2833
注 册:2018-3-13
收藏
得分:0 
设置一个计数器,避开首次双击时第二次触发的RowColChange事件,基本可用吧,没仔细测试各种情况
程序代码:
Create Cursor tt (F1 C(10), F2 C(10), F3 I)
Insert Into tt Values ("ABC", "123456", 101)
Clear
Insert Into tt Values ("DEF", "654321", 202)
Insert Into tt Values ("GHI", "456123", 303)
Go Top
Of = Createobject("form1")
Of.Show(1)

Define Class form1 As Form
    AllowOutput = .F.
    AutoCenter = .T.
    Add Object grid1 As myGrid
Enddefine

Define Class myGrid As Grid
    AllowCellSelection = .F.
    RowHeight = 22
    DblTimes = 0        && 用于判断是否首次双击
    
    Procedure DblClick
*!*    ? Textmerge('第 <<This.DblTimes>> 次双击')
        Local nWhere, oo
        Local aTemp[1]
*!*            nWhere = 0
*!*            This.GridHitTest(Mcol(0,3),Mrow(0,3), @ nWhere)
*!*            If nWhere != 3
*!*                Return
*!*            EndIf
        = AMouseObj(aTemp)
        oo = aTemp[1]
        If (Vartype(oo) == 'O') and (Lower(oo.BaseClass) $ ',textbox,combobox,checkbox,XXXX,')
            This.AllowCellSelection = .T.
            This.ReadOnly = .F.
            oo.SetFocus()
        Else
            This.AllowCellSelection = .F.
        EndIf
    Endproc
    Procedure AfterRowColChange(nColIndex)
*!*    ? 'After Event'
        If This.DblTimes > 1
            This.AllowCellSelection = .F.
        EndIf
        This.DblTimes = This.DblTimes + 1
    Endproc
EndDefine


[此贴子已经被作者于2022-9-8 13:18编辑过]


这家伙很懒,啥也没留下
2022-09-08 13:12
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1732
专家分:3329
注 册:2012-2-29
收藏
得分:4 
上面吹版(14楼)、csyx版主(19楼),均能达到要求,学习啦,谢谢!
2022-09-09 07:03
快速回复:表单中grid 控件使用的问题,求指教
数据加载中...
 
   



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

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