以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]DrawCell事件 效率求助  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=74297)

--  作者:huangfanzi
--  发布时间:2015/9/8 8:30:00
--  [求助]DrawCell事件 效率求助
下面代码中,黄底部分加上去后,效率执行太低下了,才10条不到的需要绘制的数据,要执行2秒,老师帮我看看是不是代码用的不合理。

DrawCell事件

If e.Table.Rows.Count >0 Then    
    e.Table.DataTable.AddUserStyle("样式1", Color.Yellow,Color.Black)
    e.Table.DataTable.AddUserStyle("样式2", Color.Blue,Color.Black)
    Dim t As Table = Tables("生产计划通知单")
    If e.Row("生产计划编号") = t.Current("生产计划编号") Then
        e.style = "样式1"
    Else
      Dim ls As List(Of String) = DataTables("生产计划通知单").SQLGetValues("生产计划编号" , "[通知类型] = \'" & t.Current("通知类型") & "\'")
         If ls.Contains(e.Row("生产计划编号")) Then            
                e.style = "样式2"           
        End If
    End If
End If
[此贴子已经被作者于2015/9/8 8:30:23编辑过]

--  作者:Hyphen
--  发布时间:2015/9/8 9:09:00
--  

 

[此贴子已经被作者于2015/9/8 9:14:39编辑过]

--  作者:rjh4078
--  发布时间:2015/9/8 9:12:00
--  
弄个变量 drawcell只需判断变量即可 不要把大量判断放到drawcell里
--  作者:大红袍
--  发布时间:2015/9/8 9:12:00
--  

肯定不合理,drawcell是重复不断的执行的。不要重复用SqlGetValues

 

你可以用一个变量记录ls,在需要重新获取的地方执行sqlGetValues(比如CurrentChanged事件),然后在drawcell直接判断

 

public ls as List(Of String)

 

------------------

 

ls = DataTables("生产计划通知单").SQLGetValues("生产计划编号" , "[通知类型] = \'" & t.Current("通知类型") & "\'")

 

---------------------------

 

If ls.Contains(e.Row("生产计划编号")) Then
    e.style = "样式2"
End If


--  作者:huangfanzi
--  发布时间:2015/9/8 9:47:00
--  
果然,效率不是提高一点点,看来原来没有好好掌握DrawCell事件的特性,原代码中不停的写入集合,另有一个小问题,也请教下:

假如有二行数据,结构如下:
通知类型    通知单号
A                001
A                001

当输入第二行数据的类型时,如果与上一行一致,则通知单号也用上一行的通知单号
下面是我目前的写法,但越看越别扭,是不是有更简单的写法。
DataColChanged 事件

If e.DataCol.Name = "通知类型" Then
    If e.DataRow("通知类型") = CurrentTable.Rows(CurrentTable.Current.Index - 1)("通知类型") Then
        e.DataRow("通知单号") = CurrentTable.Rows(CurrentTable.Current.Index - 1)("通知单号")
    Else
        e.DataRow("通知单号") = Nothing
    End If
End If
[此贴子已经被作者于2015/9/8 9:47:42编辑过]

--  作者:大红袍
--  发布时间:2015/9/8 10:42:00
--  

DataColChanged事件处理行位置的代码肯定别扭。

 

 

If e.DataCol.Name = "通知类型" Then
    Dim t As Table = Tables(e.DataTable.Name)
    Dim idx As Integer = t.FindRow(e.DataRow)
    If idx > 0 AndAlso e.DataRow("通知类型") = t.rows(idx-1)("通知类型") Then
        e.DataRow("通知单号") = t.rows(idx-1)("通知单号")
    Else
        e.DataRow("通知单号") = Nothing
    End If
End If