注册 登录
编程论坛 VFP论坛

请教动态创建grid,如何设置录入数据时,光标在最左侧?谢谢

wxzd123 发布于 2025-06-29 15:48, 340 次点击
如果是在表单上设计好grid,可在grid的的各列的text的Click事件中this.SelStart = 0,可动态的没有办法录入,请教如何设置,一次只设置一列还是所有列一次设置?谢谢
11 回复
#2
sam_jiang2025-06-29 22:27
创建一个text控件类,在gotfocus事件里加入这句代码,不要加在click事件里,然后在form的activate里把grid里所有的column里的text控件换成自定义的text
控件
#3
wxzd1232025-06-30 05:48
以下是引用sam_jiang在2025-6-29 22:27:45的发言:

创建一个text控件类,在gotfocus事件里加入这句代码,不要加在click事件里,然后在form的activate里把grid里所有的column里的text控件换成自定义的text
控件

请教sam_jiang老师:
是这样添加吗?可以一次把表格所有的添加忙碌是一个一个添加
Thisform.Grid2.Columns(1).AddObject()
请问移去原来表格text怎么写?谢谢


#4
ykxby0012025-07-01 07:27
Format="KTZ"
#5
iswith2025-07-01 11:08
以下是引用ykxby001在2025-7-1 07:27:50的发言:

Format="KTZ"
#6
wxzd1232025-07-01 14:46
以下是引用ykxby001在2025-7-1 07:27:50的发言:

Format="KTZ"

请教老师代码放在哪
我放在命令按钮中ThisForm.Grid1.Column1.Text1.Format='KTZ',不行
放在表格的init中也不行,放在表格的text1的click和gotfocus中也不好使
#7
sam_jiang2025-07-01 14:55
回复 3楼 wxzd123
比如放在grid的init事件中,用于替换所有文本框为自己的文本框
FOR EACH oColumn IN this.Columns
   oColumn.RemoveObject("Text1")
   oColumn.AddObject("mytext1", "mytext")
ENDFOR
#8
wxzd1232025-07-01 19:29
以下是引用sam_jiang在2025-7-1 14:55:07的发言:

比如放在grid的init事件中,用于替换所有文本框为自己的文本框
FOR EACH oColumn IN this.Columns
   oColumn.RemoveObject("Text1")
   oColumn.AddObject("mytext1", "mytext")
ENDFOR

谢谢,我试试
#9
wxzd1232025-07-01 20:02
只有本站会员才能查看附件,请 登录
鼠标点后变空了,什么都不显示
#10
sam_jiang2025-07-01 20:57
回复 9楼 wxzd123
你的自定义控件是怎么写的?
gotfocus里面加这两句试试
selstart=0,
sellength=0...
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2025-7-1 21:14编辑过]

#11
wxzd1232025-07-01 21:01
只有本站会员才能查看附件,请 登录
还是一样
#12
sam_jiang2025-07-01 21:17
回复 11楼 wxzd123
加一句visible=.t.,添加自定义控件时,默认visible是.f.的。

我写了下面代码测试了一下,vfp9.0+win7下通过
程序代码:

** Test.prg
of = CREATEOBJECT("Form1")
of.show(1)
RETURN


DEFINE CLASS Form1 As Form
    ADD OBJECT Command1 AS CommandButton WITH top=10,left=10,height=25,caption="切换表"
   
    PROCEDURE Init
         ENDPROC
   
    PROCEDURE Command1.Click
        USE
        IF VARTYPE(thisform.Grid1) == "O"
            thisform.RemoveObject("Grid1")
        ENDIF
        thisform.AddObject("Grid1", "_Grid")
        thisform.Grid1.Top = 40
        thisform.Grid1.Left = 10
        IF EMPTY(this.Tag)
            this.Tag = "1"
                * 相当于 use 表1
            CREATE CURSOR 表1 (f1 I, f2 I, f3 I,f4 I)
            INSERT INTO 表1 VALUES (1, 2, 3,4)
            INSERT INTO 表1 VALUES (5, 6,7,8)
            GO TOP
            thisform.Grid1.RecordSource = "表1"
            thisform.grid1.changetextbox()
            thisform.Refresh()
        ELSE
            this.Tag = ""
                * 相当于 use 表2
            CREATE CURSOR 表2 (f1 I, f2 I, f3 I, f4 I)
            INSERT INTO 表2 VALUES (4, 5, 6,7)
            INSERT INTO 表2 VALUES (8, 9,10,11)
            GO TOP
            thisform.Grid1.RecordSource = "表2"
            thisform.grid1.changetextbox()
            thisform.Refresh()
        ENDIF
    ENDPROC
ENDDEFINE


DEFINE CLASS _Grid AS Grid
    Visible = .T.
*    ColumnCount [color=#808080]= 3[/color]
    RecordSourceType=1

    PROCEDURE changetextbox
        FOR i=1to this.columncount
            this.Columns(i).RemoveObject("Text1")
            this.Columns(i).AddObject("Text1", "_TextBox")
            this.Columns(i).visible=.t.
        ENDFOR   
    ENDPROC
ENDDEFINE


DEFINE CLASS _TextBox AS TextBox
    Visible = .T.

    PROCEDURE KeyPress(nKeyCode, nShiftAltCtrl)
        IF nkeycode=13
            *MESSAGEBOX(this.value+1)
            *下面代码将在表格最后一行敲回车键后进入下一行
            IF RECNO()<RECCOUNT() AND thisform.grid1.activecolumn=FCOUNT()
                NODEFAULT
                SKIP
                thisform.grid1.activatecell(RECNO(),1)
            ENDIF     
        ENDIF   
    ENDPROC

    PROCEDURE Click
        *MESSAGEBOX(this.value)
        *nposition=LEN(STR(this.value))-OCCURS(" ",STR(this.Value))
        this.SelStart=0 &&显示数字类型且表格列不够宽时,点击后会出现空白现象,拉宽列就可以显示出来了
        this.SelLength=0
        *MESSAGEBOX(STR(nposition))
        *this.Format="KTZ"
    ENDPROC
ENDDEFINE


[此贴子已经被作者于2025-7-1 22:15编辑过]

1