| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3853 人关注过本帖
标题:请教Grid如何实现各行不同的RowHeight
只看楼主 加入收藏
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
结帖率:66.67%
收藏
已结贴  问题点数:20 回复次数:7 
请教Grid如何实现各行不同的RowHeight
一个日志办公软件,用Grid显示计划、总结、建议等内容(当然是Memo字段了,且有换行,故Grid中换成了EditBox显示),当然可以通过FontMetric等取得内容的高、宽去调整行高行宽,但是问题来了,一调整所有行都调了,求教如何实现每行不同的行高。谢谢。

       有用过MSHFlexGrid,能实现,但是数据超过1000条,那是太慢了,半小时以上还没调整完,100条记录都要调整5秒。所以不考虑MSHFlexGrid.
搜索更多相关主题的帖子: Grid 不同 内容 调整 MSHFlexGrid 
2018-11-22 13:23
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
单用GRID实现不了,M字段内容多的话,放到GRID里方便不了多少,还多占用了屏幕空间,可用一个EDITBOX来处理当前记录M字段内容。
2018-11-22 14:57
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
收藏
得分:0 
老大,我就是用的EditBox,现在的问题是老板要求自适应行高,各行内容有3行的有5行的,Grid有不有方法实现各行不同行高。
现有的RowHeight是会对所有行的,一调就全调了。想实现的就是第1行高25,第2行高30,第3行高49等,诸如此类,各行能各自显示完该行的内容。
2018-11-22 17:57
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
收藏
得分:0 
GridTest.rar (7.41 KB)

附件中有个样本,就是不能实现。
上面的是MSHFlexGrid,可以调整,100条记录都要好久
下面是VFP的Grid,现在是动态依照内容调整当前行的高,当然一调所有行也调了。
2018-11-22 18:36
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:709
专家分:2848
注 册:2018-3-13
收藏
得分:0 
vfp的表格控件是不可能做到不同行高的,不用想了
一定要实现此功能的话,只能使用第三方控件,例如你使用的 MSHFlexGrid
唯一可能的是优化你的代码,例如你的 ResizeRowCol 做如下优化,大概可提速4倍左右

Local lnRow,lnCol,loGrd As MSHierarchicalFlexGridLib.MSHFlexGrid.6,lnWH[2],lnHeight,n,m
Local nrx, nry, ss

ss = Seconds()
Declare Long LockWindowUpdate in win32api Long
LockWindowUpdate(This.hfgrd.hWnd)
nrx = Twips2Pixels(1, 0)
nry = Twips2Pixels(1, 1)

loGrd=This.hfgrd
lnRow=loGrd.Rows-1
lnCol=3
lnHeight=0
For N=1 To lnRow
    For m=1 To 3
        getStringWidthHeight(loGrd.TextMatrix(N,m),@lnWH)
        lnHeight=Max(lnHeight,lnWH[2])
        *-- loGrd.ColWidth(m,0)=Pixels2Twips(lnWH,0)
        loGrd.ColWidth(m,0) = lnWH[1] / nrx
    Endfor
    *-- loGrd.RowHeight(N)=Pixels2Twips(lnHeight,1)
    loGrd.RowHeight(N) = lnHeight / nry
    STORE 0 TO lnHeight
Endfor
LockWindowUpdate(0)
? '耗时:', Seconds() - ss

getStringWidthHeight 函数可能也能再优化一下


[此贴子已经被作者于2018-11-22 20:14编辑过]


这家伙很懒,啥也没留下
2018-11-22 20:12
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
收藏
得分:0 
回复 5楼 csyx
谢谢你的提议,这个方法确实好,固定缇到像素的转换比到1:15,减少了函数调用。
但是MSHFlexGrid是针对VB的东西,数据内部处理就是用的数组操作,反应确实太慢了,就按这样优化后也要5秒左右,不过100条记录。试想一个公司100人(实际有300多人啊),按20天上班每月,那将是2000条记录,至少是20倍于这个时间(实际可能更多,二维数组更大了),所以我不选用MSHFlexGrid。尝试修改_Grid的基类,实在找不到法门。
2018-11-22 21:11
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:709
专家分:2848
注 册:2018-3-13
收藏
得分:20 
我敢打一块钱的赌,vfp的grid是绝对没可能做到不同行高的
还是想想如何优化吧
例如,不要一开始就调整所有行的高/宽度,而是仅调整表格可见范围内的行,列
TopRow, LeftCol 可以得到第一可见行和可见列的索引号,在 Scroll 事件中循环调整可见范围内的行列,就没有多少计算量了

这家伙很懒,啥也没留下
2018-11-22 22:39
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
收藏
得分:0 
回复 7楼 csyx
你的思路是对的,谢谢。就是调整可见行。TopRow取置顶行号,Rows取当前可见行数,估计也就10条记录。置于宽有ScrollBar就先不管它了。
至于Scroll事件,因为MSHFlexGrid没有MouseWheel,我是把窗口(_Screen)的MouseWheel绑到了容器(Form)上,再结合Amouse()看鼠标是否在MSHFlexGrid上,不晓得会不会触发它的Scroll。

谢谢你的提醒,我先按这个思路去改。谢谢。
2018-11-23 13:24
快速回复:请教Grid如何实现各行不同的RowHeight
数据加载中...
 
   



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

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