以下是引用liuxingang28在2016-3-11 14:28:43的发言:
第一个问题:显示中文标题
若是数据库表,可修改表结构,设置每个字段的 Caption(标题)为中文,如:将 name 的 Caption 设置为“姓名”。然后,设置表格的 ComumnCount = -1 即可在 Grid 中显示中文列标题。
若是自由表,只能通过修改 Header 的 Caption 了。如:将第一列的列标题设置为“姓名”:THISFORM.Grid1.Columns[1].Header1.Cpation = "姓名"
第二个问题:锁定姓名列
这个比较 Easy,在表单的 Init 事件中输入:THIS.Grid1.LockColumns = 1。注:若 Grid.ColumnCount=-1,则无法在设计环境下直接修改属性 Grid.LockColumn=1
第三个问题:单击列标题实现排序
这个有点难度。
第一步:准备两张图片,第一张是向上箭头 up.bmp,表示升序,第二张是向下箭头 down.bmp,表示降序。
第二步:新建一个 MyProc.prg,其中定义了一个 Header 类: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 DESC
ELSE
INDEX ON &cFldName TAG (cFldName) DESC && 索引标记不存在,新建之
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
GO TOP
THISFORM.Refresh
SELECT (nSelect)
ENDPROC
ENDDEFINE
第三步:在表格的 Init 事件中输入以下代码:
LOCAL oCol,cOldCaption
FOR EACH oCol IN THIS.Columns
cOldCaption = oCol.Header1.Caption && 保存原标题
oCol.RemoveObject('Header1') && 移除原 Header
oCol.NewObject('Header1','MyHeader','myproc.prg') && 添加新 Header
oCol.Header1.Caption = cOldCaption && 恢复原标题
NEXT
请教:这样进行点head排序了,可是问题又来了,就是点滚动条拖出来的那些列排序的时候,一刷新就回到初始画面了,能否保持在拖滚动条那里呢?不知道我说的是否明白!