Foxtable(狐表)用户栏目专家坐堂 → [求助]DrawCell事件 效率求助


  共有2853人关注过本帖树形打印复制链接

主题:[求助]DrawCell事件 效率求助

帅哥哟,离线,有人找我吗?
huangfanzi
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
[求助]DrawCell事件 效率求助  发帖心情 Post By:2015/9/8 8:30:00 [只看该作者]

下面代码中,黄底部分加上去后,效率执行太低下了,才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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2015/9/8 9:09:00 [只看该作者]

 

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

 回到顶部
帅哥哟,离线,有人找我吗?
rjh4078
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐精 帖子:3355 积分:24732 威望:0 精华:0 注册:2012/3/26 21:47:00
  发帖心情 Post By:2015/9/8 9:12:00 [只看该作者]

弄个变量 drawcell只需判断变量即可 不要把大量判断放到drawcell里

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By: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


 回到顶部