以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- C1FlexGrid生成效率问题 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=123692) |
-- 作者:rjh4078 -- 发布时间:2018/8/21 12:42:00 -- C1FlexGrid生成效率问题 Dim t As Table=Tables("生产计划单_t4") t.Fill("sel ect 订单号 from {计划明细} where [_Identify]=0",Functions.Execute("返回数据源"),True) TblBase = t.Grid t.StopRedraw With TblBase \'\' .Font = New Font("微软雅黑",9) .SubtotalPosition = C1FlexGrid.SubtotalPositionEnum.AboveData .AllowFreezing = C1FlexGrid.AllowFreezingEnum.None .AllowResizing = C1FlexGrid.AllowResizingEnum.Columns .VisualStyle = C1FlexGrid.VisualStyle.System .Tree.Column = 1 .Tree.LineStyle = Drawing2D.DashStyle.Dash .Tree.Style = C1FlexGrid.TreeStyleFlags.CompleteLeaf \' .Tree.NodeImageCollapsed = GetImage("0.png") \' .Tree.NodeImageExpanded = GetImage("1.png") .Cols(0).AllowResizing = False .Cols(0).TextAlign = C1FlexGrid.TextAlignEnum.CenterCenter End With t.DataTable.DataRows.Clear With Tables("生产计划单") If .current IsNot Nothing Then Dim Node As C1FlexGrid.Node Dim s As String Dim cl As String For Each r As DataRow In DataTables("计划明细").Select("计划单号=\'" & .current("计划单号") & "\'","排程顺序,级码") If r("级码").split(".").length=1 Then Node = TblBase.Rows.InsertNode(TblBase.Rows.Count, 0) For Each c As Col In Tables("计划明细").Cols If t.DataTable.DataCols.Contains(c.name)=False Then t.DataTable.DataCols.add(c.name,Gettype(String),255) End If node.Row(c.name)=r(c.name) Next Else If r("订单号")=node.Row("订单号") Then Node = TblBase.Rows.InsertNode(TblBase.Rows.Count, 1) For Each c As Col In Tables("计划明细").Cols If t.DataTable.DataCols.Contains(c.name)=False Then t.DataTable.DataCols.add(c.name,Gettype(String),255) End If node.Row(c.name)=r(c.name) Next End If End If \'\' Functions.Execute("loop", node) Next End If End With vars("展开")=1 t.Cols(t.Cols(0).name).Width=120 t.ResumeRedraw 这是生成C1FlexGrid目录树表的代码 如果数据超过5行就已经非常卡了 30行简直要命 有什么优化方法,这个树只有2层,是固定的,根据级码和订单号进行父子关联
|
-- 作者:有点蓝 -- 发布时间:2018/8/21 13:50:00 -- 暂时没有时间去研究这个C1FlexGrid底层的应用。可以上传一个实例,有空测试一下。 卡是指展开收起目录树?还是指录入时?表格还有没有其他表事件? 上面代码唯一的缺陷是没有必要在外层for循环里判断和添加列,拿出来单独执行一次就可以了。其他地方看不出会导致卡
|
-- 作者:rjh4078 -- 发布时间:2018/8/21 16:23:00 -- 卡是指生成目录树的时候 根据数据量有3-10秒的卡顿 |
-- 作者:有点蓝 -- 发布时间:2018/8/21 16:28:00 -- 判断和添加列的代码,拿出来单独执行一次。 |
-- 作者:rjh4078 -- 发布时间:2018/8/22 7:59:00 -- With Tables("生产计划单") If .current IsNot Nothing Then Dim Node As C1FlexGrid.Node Dim s As String Dim cl As String For Each c As Col In Tables("计划明细").Cols If t.DataTable.DataCols.Contains(c.name)=False Then t.DataTable.DataCols.add(c.name,Gettype(String),255) End If For Each r As DataRow In DataTables("计划明细").Select("计划单号=\'" & .current("计划单号") & "\'","排程顺序,级码") If r("级码").split(".").length=1 Then Node = TblBase.Rows.InsertNode(TblBase.Rows.Count, 0) node.Row(c.name)=r(c.name) Next Else If r("订单号")=node.Row("订单号") Then Node = TblBase.Rows.InsertNode(TblBase.Rows.Count, 1) node.Row(c.name)=r(c.name) Next End If End If Next End If End With 改成这样 还是没有改善
|
-- 作者:有点蓝 -- 发布时间:2018/8/22 8:42:00 -- 上实例测试 |