以文本方式查看主题

-  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
--  
上实例测试