注册 登录
编程论坛 VFP论坛

关于子表的DynamicBackColor斑马色隔行显示,记录号分隔不太好用,各位有什么好办法

shonken 发布于 2023-04-27 11:04, 1460 次点击
数据是通过CA读取SQL,子表与父表关联索引后,用MOD(RECNO(),2)作为DynamicBackColor条件达不到斑马色隔行的效果,见下图,各位有什么办法吗?

只有本站会员才能查看附件,请 登录
16 回复
#2
吹水佬2023-04-27 11:22
有索引文件的顺序与RECNO()无关,只浏览可建临时表
#3
laowan0012023-04-27 15:57
子表增加一个标识字段,按索引顺序赋值,内容是类似recn()的顺序号,这样也许行
#4
shonken2023-04-28 16:10
以下是引用吹水佬在2023-4-27 11:22:59的发言:

有索引文件的顺序与RECNO()无关,只浏览可建临时表


临时表斑马色没问题
#5
shonken2023-04-28 16:10
以下是引用laowan001在2023-4-27 15:57:58的发言:

子表增加一个标识字段,按索引顺序赋值,内容是类似recn()的顺序号,这样也许行


CA,远程表,不用临时增加列了
#6
东海ECS2023-04-28 19:04
使用 DynamicBackColor 属性实现斑马色隔行的方法在子表中通常是通过给记录号分配颜色来实现,但这种方法的确存在一些限制。

如果记录号分隔不好用,可以尝试使用 DataGridView 的 AlternatingRowsDefaultCellStyle 属性来实现斑马色隔行效果,具体操作如下:

打开子表的属性窗口,选择“DataGridView”节点,找到“DefaultCellStyle”属性,展开后可以看到“AlternatingRowsDefaultCellStyle”属性。
点击“AlternatingRowsDefaultCellStyle”的“...”按钮,进入编辑窗口。
在编辑窗口中设置颜色,比如“BackColor”设置为“LightGray”。
点击确定,保存设置。
这样,就可以在子表中实现斑马色隔行效果,且不需要额外的记录号列。如果需要给特定行设置不同的背景色,可以使用 DataGridView 的“CellFormatting”事件来实现。
#7
吹水佬2023-04-28 21:55
以下是引用东海ECS在2023-4-28 19:04:47的发言:

使用 DynamicBackColor 属性实现斑马色隔行的方法在子表中通常是通过给记录号分配颜色来实现,但这种方法的确存在一些限制。

如果记录号分隔不好用,可以尝试使用 DataGridView 的 AlternatingRowsDefaultCellStyle 属性来实现斑马色隔行效果,具体操作如下:

打开子表的属性窗口,选择“DataGridView”节点,找到“DefaultCellStyle”属性,展开后可以看到“AlternatingRowsDefaultCellStyle”属性。
点击“AlternatingRowsDefaultCellStyle”的“...”按钮,进入编辑窗口。
在编辑窗口中设置颜色,比如“BackColor”设置为“LightGray”。
点击确定,保存设置。
这样,就可以在子表中实现斑马色隔行效果,且不需要额外的记录号列。如果需要给特定行设置不同的背景色,可以使用 DataGridView 的“CellFormatting”事件来实现。

VFP grid的DynamicBackColor与DataGridView是什么关系?
#8
shonken2023-04-28 22:39
以下是引用东海ECS在2023-4-28 19:04:47的发言:

使用 DynamicBackColor 属性实现斑马色隔行的方法在子表中通常是通过给记录号分配颜色来实现,但这种方法的确存在一些限制。

如果记录号分隔不好用,可以尝试使用 DataGridView 的 AlternatingRowsDefaultCellStyle 属性来实现斑马色隔行效果,具体操作如下:

打开子表的属性窗口,选择“DataGridView”节点,找到“DefaultCellStyle”属性,展开后可以看到“AlternatingRowsDefaultCellStyle”属性。
点击“AlternatingRowsDefaultCellStyle”的“...”按钮,进入编辑窗口。
在编辑窗口中设置颜色,比如“BackColor”设置为“LightGray”。
点击确定,保存设置。
这样,就可以在子表中实现斑马色隔行效果,且不需要额外的记录号列。如果需要给特定行设置不同的背景色,可以使用 DataGridView 的“CellFormatting”事件来实现。


用AI作答?
#9
csyx2023-04-29 08:03
不允许加辅助字段的话估计是没啥好办法了
如果 grid 是表单上唯一的控件,或者说唯一可接受焦点的控件,用 This.ActiveRow 代替 Recno() 也许勉强可接受
#10
吹水佬2023-04-29 09:02
以下是引用csyx在2023-4-29 08:03:16的发言:

不允许加辅助字段的话估计是没啥好办法了
如果 grid 是表单上唯一的控件,或者说唯一可接受焦点的控件,用 This.ActiveRow 代替 Recno() 也许勉强可接受


记得以前也有探讨过 ActiveRow 区分奇偶行的问题,但有意思的是:
1、用键盘滚屏正常,但用鼠标滚屏异常。
2、在Scrolled事件中用SetFocus刷新表格,用鼠标滚轮正常,但用点击或拖动滚动条异常。
3、在Scrolled事件中用延时或异步消息执行SetFocus好象还可以。

因为当GRID不具有焦点或访问表格空白行时 ActiveRow 为 0,所以当滚动时要重新使GRID具有焦点。
但GRID的滚动事件Scrolled也有点特别,不能在Scrolled事件中出现“中断”状态,VFP帮助说的是因为当滚动时会出现屏幕刷新问题。

#11
csyx2023-04-29 12:37
以下是引用吹水佬在2023-4-29 09:02:43的发言:
因为当GRID不具有焦点或访问表格空白行时 ActiveRow 为 0,所以当滚动时要重新使GRID具有焦点。
但GRID的滚动事件Scrolled也有点特别,不能在Scrolled事件中出现“中断”状态,VFP帮助说的是因为当滚动时会出现屏幕刷新问题。

如果 ActiveRow 能具有确定性,我不会说勉强可接受
#12
sostemp2023-04-29 12:48
以下是引用吹水佬在2023-4-29 09:02:43的发言:



记得以前也有探讨过 ActiveRow 区分奇偶行的问题,但有意思的是:
1、用键盘滚屏正常,但用鼠标滚屏异常。
2、在Scrolled事件中用SetFocus刷新表格,用鼠标滚轮正常,但用点击或拖动滚动条异常。
3、在Scrolled事件中用延时或异步消息执行SetFocus好象还可以。

因为当GRID不具有焦点或访问表格空白行时 ActiveRow 为 0,所以当滚动时要重新使GRID具有焦点。
但GRID的滚动事件Scrolled也有点特别,不能在Scrolled事件中出现“中断”状态,VFP帮助说的是因为当滚动时会出现屏幕刷新问题。

通过SetAll表格控件的DynamicBackColor,确实会存在这个问题。 ActiveRow 没用过。
持续关注!
#13
shonken2023-04-29 14:40
以下是引用csyx在2023-4-29 12:37:20的发言:


如果 ActiveRow 能具有确定性,我不会说勉强可接受


我用过ActiveRow ,要GRID取得焦点才会生效,而且只是当前显示的内容才斑马色,滚动后的数据也没效果
#14
吹水佬2023-04-29 15:54
以下是引用shonken在2023-4-29 14:40:36的发言:

我用过ActiveRow ,要GRID取得焦点才会生效,而且只是当前显示的内容才斑马色,滚动后的数据也没效果


有个问题:grid失焦时ActiveRow为0,导致不管当前在那一行MOD(this.ActiveRow,2)都为0。
简单测试了一下,其他好像还可以接受。

只有本站会员才能查看附件,请 登录


程序代码:

DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG

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

of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 As Form
    AllowOutput = 0
    AutoCenter  = 1
    ADD OBJECT cmd1  as commandbutton WITH top=4,left=10,height=22,caption="SORT"
    ADD OBJECT text1 as textbox       WITH top=4,left=120
    ADD OBJECT grid1 as myGrid        WITH top=30
   
    PROCEDURE Init
        BINDEVENT(this.hWnd, 0x401, this, "myGridSetFocus")
        PostMessage(thisform.hWnd, 0x401, 0, 0)
    ENDPROC
     
    PROCEDURE cmd1.Click
        IF DESCENDING()
            INDEX on F2 TAG tt_F2 ASCENDING
        ELSE
            INDEX on F2 TAG tt_F2 DESCENDING
        ENDIF
        thisform.Grid1.SetFocus
    ENDPROC
   
    FUNCTION myGridSetFocus(hWnd, nMsg, wParam, lParam)
        this.Grid1.SetFocus
    ENDPROC   
ENDDEFINE

DEFINE CLASS myGrid as Grid
    PROCEDURE init
        this.SetAll("DynamicBackColor", "IIF(MOD(this.ActiveRow,2)==0,0xF0F0F0,0xC0C0C0)", "Column")
    ENDPROC

    PROCEDURE Scrolled(nDirection)
        DODEFAULT()
        PostMessage(thisform.hWnd, 0x401, 0, 0)
    ENDPROC
ENDDEFINE


#15
shonken2023-04-29 18:25
以下是引用吹水佬在2023-4-29 15:54:16的发言:



有个问题:grid失焦时ActiveRow为0,导致不管当前在那一行MOD(this.ActiveRow,2)都为0。
简单测试了一下,其他好像还可以接受。




DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG

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

of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 As Form
    AllowOutput = 0
    AutoCenter  = 1
    ADD OBJECT cmd1  as commandbutton WITH top=4,left=10,height=22,caption="SORT"
    ADD OBJECT text1 as textbox       WITH top=4,left=120
    ADD OBJECT grid1 as myGrid        WITH top=30
   
    PROCEDURE Init
        BINDEVENT(this.hWnd, 0x401, this, "myGridSetFocus")
        PostMessage(thisform.hWnd, 0x401, 0, 0)
    ENDPROC
     
    PROCEDURE cmd1.Click
        IF DESCENDING()
            INDEX on F2 TAG tt_F2 ASCENDING
        ELSE
            INDEX on F2 TAG tt_F2 DESCENDING
        ENDIF
        thisform.Grid1.SetFocus
    ENDPROC
   
    FUNCTION myGridSetFocus(hWnd, nMsg, wParam, lParam)
        this.Grid1.SetFocus
    ENDPROC   
ENDDEFINE

DEFINE CLASS myGrid as Grid
    PROCEDURE init
        this.SetAll("DynamicBackColor", "IIF(MOD(this.ActiveRow,2)==0,0xF0F0F0,0xC0C0C0)", "Column")
    ENDPROC

    PROCEDURE Scrolled(nDirection)
        DODEFAULT()
        PostMessage(thisform.hWnd, 0x401, 0, 0)
    ENDPROC
ENDDEFINE


效果不错
有个问题,如果当前容器对象里有多个GRID呢?
#16
shonken2023-04-29 18:31
一个容器里有多个GRID的大概思路是这样:

在Gird中新建一个x_GotFocus方法,绑定Controls(2)的GotFocus事件,用来传递当前GRID的名字
  Bindevent(LoColobj.Controls(2),"GotFocus",This,"x_GotFocus")

符合GRID名字的再获得焦点

[此贴子已经被作者于2023-4-29 19:03编辑过]

#17
schtg2023-04-29 19:35
回复 14楼 吹水佬
好!谢谢!
1