Foxtable(狐表)用户栏目专家坐堂 → [求助]绘制单元格代码太卡,哪位大神能帮我优化一下


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

主题:[求助]绘制单元格代码太卡,哪位大神能帮我优化一下

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2013/9/9 21:19:00 [显示全部帖子]

 用下面的代码,可能会好一些,最多也只能优化到这里了。期待高手。

If e.Row.Index >= e.Table.TopVisibleRow AndAlso e.Row.Index <= e.Table.BottomVisibleRow Then
    Dim flag As Boolean = False
    If e.Row.IsNull(e.Col.Name)= False   Then
        For j As Integer = 0 To 6
            Dim s As New List (Of String)
            Dim val As String = e.Row(e.Col.Name)
            Dim nr As Row = e.Table.Rows(e.Row.Index + 1)
            
            For i As Integer = 1 To 6
                If val = nr(33*j+i) Then
                    flag = True
                    Exit For
                End If
            Next
            If e.Col.Index >(33*j) AndAlso e.Col.Index < (33*(j+1)+1) AndAlso flag Then
                e.Style = "下期中奖号码"
                flag = True
                Exit For
            Else 
                flag = False
            End If
        Next
    End If
    
    If flag = False Then
        If e.Col.Caption.Contains("未中奖号")  Then
            e.Style ="未中奖号"
        Else If e.Col.Caption.Contains("中奖号") Then
            e.Style ="中奖号"
        Else If e.Col.Caption= "期号" Then
            e.Style ="期号"
        End If
    End If
End If

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2013/9/9 22:37:00 [显示全部帖子]

以下是引用wangyi870704在2013-9-9 22:23:00的发言:
图片点击可在新窗口打开查看试了下,我的电脑速度提升不明显,没有那种起死回生的赶脚,不过还是谢谢大哥,能在百忙中抽空给我看程序,多谢~!图片点击可在新窗口打开查看
[此贴子已经被作者于2013-9-9 22:24:20编辑过]


主要的问题,是要去判断比较是否红色,比较耗时。

你可以另外用一张表,记录红色的位置,就不需要每次都循环比较值了,时间都是耗在那里的。

在drawcell里的代码,越简单越好,最好是一步可以达到值。

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2013/9/10 23:06:00 [显示全部帖子]

 14楼的方法很好了,介绍另一种方法。就是生成记录的样式,做一张表,然后运行如下代码(这个过程是相当漫长的,耐心等待,因为有38万行数据)

Dim t_data As Table = Tables("Main")
Dim t_style As Table = Tables("样式记录")
t_data.StopRedraw
t_style.StopRedraw
For Each r As Row In t_data.Rows
    For Each c As Col In t_data.Cols
        Dim newrow As Row = t_style.AddNew
        Dim flag As Boolean = False
        If r.IsNull(c.Name) = False AndAlso r.Index < t_data.Rows.Count - 1 Then
            For j As Integer = 0 To 6
                Dim s As New List (Of String)
                Dim val As String = r(c.Name)
                Dim nr As Row = t_data.rows(r.Index + 1)
                             
                For i As Integer = 1 To 6
                    If val = nr(33*j+i) Then
                        flag = True
                        Exit For
                    End If
                Next
                If c.Index >(33*j) AndAlso c.Index < (33*(j+1)+1) AndAlso flag Then
                    newrow("样式") = "下期中奖号码"
                    Exit For
                Else
                    flag = False
                End If
            Next
        End If
        If flag = False Then
            If c.Name.Contains("未中奖号")  Then
                newrow("样式") = "未中奖号"
            Else If c.Name.Contains("中奖号") Then
                newrow("样式") = "中奖号"
            Else If c.Name = "期号" Then
                newrow("样式") = "期号"
            End If
        End If
        newrow("X") = r.Index
        newrow("Y") = c.Index
    Next
Next
t_data.ResumeRedraw
t_style.ResumeRedraw

 然后在drawcell里写代码

Dim fdr As DataRow = DataTables("样式记录").Find("X = " & e.Row.Index & " And Y = " & e.Col.Index)
If fdr IsNot Nothing Then
    e.Style = fdr("样式")
End If、

 不过,效果测试过后也不是很显著,所以最好结合14楼方法。

 回到顶部