Foxtable(狐表)用户栏目专家坐堂 → [求助]选择目录树进行归类时,发生调用异常


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

主题:[求助]选择目录树进行归类时,发生调用异常

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


加好友 发短信
等级:三尾狐 帖子:622 积分:5303 威望:0 精华:0 注册:2022/4/4 14:42:00
[求助]选择目录树进行归类时,发生调用异常  发帖心情 Post By:2022/5/7 10:38:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:56备份 - 实验.table


图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看

事情描述
1、发生情况:  操作 预计总成本表 的 归类列 时,发生的调用异常的提醒
之前,我的归类列目录树是通过列属性直接设置的,现在改成了下拉菜单式的
ps: 我插入 很多,messagebox.show进行测试,发现,表事件循环了两遍 
2、代码如下:(写的比较乱)

①项目事件  AfterOpenProject
Tables("预计总成本").Cols("归类").DropForm = "下拉目录树"

下拉目录树的窗口事件  AfterLoad
Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1")
trv.BuildTree("一二级目录","一级目录|二级目录","","序号")

③目录树  NodeMouseClick 事件
If e.Node.Level = 1 Then '如果单击的是第二层节点
    Dim tr As Row
    Dim dr As DataRow = e.Node.DataRow '获取生成此节点的DataRow
    If e.Form.DropTable IsNot Nothing Then '如果下拉窗口是从表中打开
        tr = e.Form.DropTable.Current '获取此表的当前行
    Else '如果下拉窗口是通过DropdownBox打开
        Dim nm As String = e.Form.DropDownBox.BindingField '获取绑定的字段
        nm = nm.Split(".")(0) '获取绑定的表名
        tr = Tables(nm).Current '获取此表的当前行
    End If
    tr("归类") = dr("编码")
    'tr("一级目录") = dr("一级目录")
    'tr("二级目录") = dr("二级目录")
    '
    
    e.Form.DropDownBox.Value = tr("归类") '这行不是多余的,省略此行,无法在表中正常使用此下拉窗口输入数据.
    e.Form.DropDownBox.CloseDropdown()
End If 

④ 预计总成本 表事件 Datacolchanges

Dim F_name ,S_name , kind_name As String
F_name = e.DataRow("一级目录")
S_name = e.DataRow("二级目录")
kind_name = e.DataRow("归类")
If e.DataCol.Name = "归类" AndAlso CurrentTable.Current("num_Fri") = Nothing  '当选中的行归类列时,且未三级目录时,执行以下操作
    Dim var As String  = "↓↓↓↓"
    Dim Fri_mulu As new List(of String)
    Fri_mulu = e.DataTable.GetValues("一级目录")
    Dim Start As Boolean
    Start = Fri_mulu.Contains(var)'''''
    Dim out_row As Row = CurrentTable.Current  '定义要移动的行
    '******************************************
    '在此定义以后用到的变量
    '获取一二级目录名称
    '%%%%%%%%%%%%%%%%%%%%以下为解析编码
    Dim InCome_code As String = e.DataRow("归类")
    
    'MessageBox.Show(1)
    
    If Income_code IsNot Nothing Then
        
        
        
        Dim Find_row As DataRow
        Find_row =  DataTables("一二级目录").Find("编码 ='" & Income_code & "'")
        Dim F_num As Integer = Find_row("Fri")             ' 获取一级目录的数字编码
        Dim S_num As Integer = Find_row("Sec")
        Dim Fri_name As String  = Find_row("一级目录")   ' 把一级目录名保存到变量  Fri_name 中
        Dim Sec_name As String = Find_row("二级目录")    '把二级目录名保存到变量  Sec_name 中
        'MessageBox.Show(Fri_name)
        'MessageBox.Show(sec_name)
        'MessageBox.Show(income_code)
        'MessageBox.Show(2)
        'MessageBox.Show(f_num)
        'MessageBox.Show(s_num)
        
        '获取二级目录的数字编码
        '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        '为num_Fri  num_sec  分别整合成一个集合
        Dim Row_n As Integer = CurrentTable.Rows.Count - 1
        'MessageBox.Show("可见行位置")
        'MessageBox.Show(Row_n)
        Dim Fri_list As new List(of Integer )
        Dim Sec_list As new List(of Integer )
        
        'MessageBox.Show(3)
        'MessageBox.Show("ok")
        For i As Integer = 0 To Row_n
            Dim ff , ss As Integer
            'MessageBox.Show(i)
            ff = CurrentTable.Rows(i)("num_Fri")
            Fri_list.Add(ff)
            ss = CurrentTable.Rows(i)("num_Sec")
            Sec_list.Add(SS)
        Next
        
        '************************************************************分别两个数字集合 一级目录数字集合  Fri_list   Sec_list
        
        ' MessageBox.Show(4)
        'MessageBox.Show("到这里了吗")
    
        '**********************************************
        Select Case start
            Case False    '     当第一个时,执行以下代码
                'MessageBox.Show("为空时执行")
                'MessageBox.Show(5)
                CurrentTable.Current("一级目录") = Nothing
                CurrentTable.Current("二级目录") = Nothing
                CurrentTable.Current("num_Fri") = F_num
                CurrentTable.Current("num_Sec") = S_num
                CurrentTable.AddNew()
                CurrentTable.Current("一级目录") = "↓↓↓↓"
                CurrentTable.Current("num_Fri") = 1
                CurrentTable.Current("num_Sec") = 1
                CurrentTable.AddNew()
                CurrentTable.Current("一级目录") = Fri_name
                CurrentTable.AddNew()
                CurrentTable.Current("二级目录") = Sec_name
                '获取position
                Dim i As Integer = CurrentTable.Position
                out_row.Move(i)
                CurrentTable.AddNew()
                CurrentTable.Current("一级目录") = "合计"
                CurrentTable.Current("num_Fri") = 999
                CurrentTable.Current("num_Sec") = 999
            Case True
                'MessageBox.Show("已经存在第一条之后的三级目录归类")
                'MessageBox.Show(f_num)
                'MessageBox.Show(s_num)
                '  MessageBox.Show(6)
                '''''''''''''''''''''''''''''''''''''''''''''''''''''核心处代码
                If  Sec_list.Contains(s_num) = True   Then        '当二级目录包含时
                    Dim f_same_position As Integer = CurrentTable.FindRow("num_sec ='" & s_num & "'")
                    
                    ' MessageBox.Show(s_num)
                    'MessageBox.Show("有相同二级目录时执行")
                    out_row.Move(f_same_position)
                    CurrentTable.Current("一级目录") = Nothing
                    CurrentTable.Current("二级目录") = Nothing
                    CurrentTable.Current("num_Fri") = F_num
                    CurrentTable.Current("num_Sec") = S_num
                    'else 改成elseif
                    'MessageBox.Show(7)
                Else
                    
                    sec_list.Sort
                    '用for 找位置
                    
                    'MessageBox.Show(8)
                    
                    
                    
                    
                    Dim f_max As Integer
                    
                    For Each i As Integer In sec_list
                        If i> s_num Then
                            
                            f_max = i
                            Exit For
                        End If
                    Next
                    'MessageBox.Show(9)
                    ' MessageBox.Show(f_max)
                    'MessageBox.Show("到这里了")
                    '找到大于是s_num 的值了,赋值给f_max
                    '查找f_max 在table中的位置 '赋值给f_max_position
                    Dim f_max_position As Integer = CurrentTable.FindRow("num_sec ='" & f_max & "'")
                    
                    If f_max = 999 Then
                        'MessageBox.Show(10)
                        CurrentTable.Position = f_max_position
                        
                        '33333333333333333333333333333333333333333333333
                        If fri_list.Contains(f_num) = True Then
                            CurrentTable.InsertNew()
                            CurrentTable.Current("二级目录") = sec_name
                            out_row.Move(f_max_position )
                            CurrentTable.Current("一级目录") = Nothing
                            CurrentTable.Current("二级目录") = Nothing
                            CurrentTable.Current("num_Fri") = F_num
                            CurrentTable.Current("num_Sec") = S_num
                        Else
                            CurrentTable.InsertNew()
                            CurrentTable.Current("二级目录") = sec_name
                            CurrentTable.InsertNew()
                            CurrentTable.Current("一级目录") = fri_name
                            out_row.Move(f_max_position + 1)
                            CurrentTable.Current("一级目录") = Nothing
                            CurrentTable.Current("二级目录") = Nothing
                            CurrentTable.Current("num_Fri") = F_num
                            CurrentTable.Current("num_Sec") = S_num
                        End If
                        'MessageBox.Show(11)
                        
                    Else
                        
                        If   fri_list.Contains(f_num) = True Then
                            CurrentTable.Position = f_max_position - 1
                            'MessageBox.Show(12)
                            CurrentTable.InsertNew()
                            CurrentTable.Current("二级目录") = sec_name
                            out_row.Move(f_max_position - 1)
                            CurrentTable.Current("一级目录") = Nothing
                            CurrentTable.Current("二级目录") = Nothing
                            CurrentTable.Current("num_Fri") = F_num
                            CurrentTable.Current("num_Sec") = S_num
                        Else
                            CurrentTable.Position = f_max_position - 2
                            CurrentTable.InsertNew()
                            CurrentTable.Current("二级目录") = sec_name
                            CurrentTable.InsertNew()
                            CurrentTable.Current("一级目录") = fri_name
                            out_row.Move(f_max_position - 1)
                            CurrentTable.Current("一级目录") = Nothing
                            CurrentTable.Current("二级目录") = Nothing
                            CurrentTable.Current("num_Fri") = F_num
                            CurrentTable.Current("num_Sec") = S_num
                        End If
                        'MessageBox.Show(13)
                    End If
                End If
                '(1)在此范围内编辑 不包含的情况
                
        End Select
        ''''''''''''''''''''''''''''''''''''''''''''''''''''''''核心处代码
    End If
    
End If


If e.DataCol.Name = "计算口径" Then
    Dim f_row As DataRow
    Dim filte = CurrentTable.Current("计算口径")
    
    f_row = DataTables("计算口径").Find("计算口径 =  '"& filte &"'  ")
    CurrentTable.Current("口径工程量") = f_row("工程量")
    
    
End If

If e.DataCol.Name = "num_fri"  Then
    If CurrentTable.Current("num_fri") IsNot Nothing Then
        Dim drs As List(of DataRow)
        drs = DataTables("预计总成本").Select("[序列号] > 0")
        Dim amount ,total ,cost As Double
        
        For Each dr As DataRow In drs
            Dim xn As Integer
            xn = dr("序列号")
            With DataTables("整理清单")
                amount = .Compute("sum(工程量)","序列号 ='" & xn & "'")
                Total = .Compute("sum(综合合价)", "序列号 ='" & xn & "'")
            End With
            cost = DataTables("人材机明细").Compute("sum(不含税合价)","序列号 ='" & xn & "'")
            
            dr("工程量_数量") = amount
            dr("合计_收入") = total
            dr("单价_收入") = total / amount
            
        Next
    End If
End If

If e.DataCol.Name = "口径工程量" Then
    If CurrentTable.Current("合计_收入") IsNot Nothing AndAlso CurrentTable.Current("合计_成本") IsNot Nothing Then
        
        Dim dr As Row = CurrentTable.Current
        
        
        dr("平米_收入")  = dr("合计_收入")  / dr("口径工程量")
        dr("平米_成本") = dr("合计_成本") / dr("口径工程量")
        dr("平米_盈亏") = dr("平米_收入")  - dr("平米_成本")
        
        
    End If
    
End If




 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:112389 积分:572213 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2022/5/7 11:23:00 [只看该作者]

几个问题。
1、不要在datacolchanged事件里使用CurrentTable.Current这种用法,如果要获取当前行,应该是e.datarow

2、代码里的find函数结果没有判断空值:http://www.foxtable.com/webhelp/topics/0396.htm,看示例三说明

对于上面2点举例说明一下,比如
If e.DataCol.Name = "计算口径" Then
    Dim f_row As DataRow
    Dim filte = CurrentTable.Current("计算口径")
    
    f_row = DataTables("计算口径").Find("计算口径 =  '"& filte &"'  ")
    CurrentTable.Current("口径工程量") = f_row("工程量")
    
    
End If
就应该改为
If e.DataCol.Name = "计算口径" Then
    Dim f_row As DataRow
    Dim filte = e.datarow("计算口径")
    
    f_row = DataTables("计算口径").Find("计算口径 =  '" & filte & "'  ")
if f_row isnot nothing then
    e.datarow("口径工程量") = f_row("工程量")
    end if
    
End If

3、除法都没有判断除数是否为0,比如c=a/b,如果b为0 会出错的
dr("平米_收入")  = dr("合计_收入")  / dr("口径工程量")

4、我不理解您的业务,但是一些逻辑处理是有问题的,比如下面代码,我无法理解为什么任意一个num_fri单元格的值都需要对"[序列号] > 0"的行全部重算一遍,也看不出来num_fri的值什么地方和这个计算逻辑有关联
If e.DataCol.Name = "num_fri"  Then
    If CurrentTable.Current("num_fri") IsNot Nothing Then
        Dim drs As List(of DataRow)
        drs = DataTables("预计总成本").Select("[序列号] > 0")
        Dim amount ,total ,cost As Double
        
        For Each dr As DataRow In drs
            Dim xn As Integer
            xn = dr("序列号")
            With DataTables("整理清单")
                amount = .Compute("sum(工程量)","序列号 ='" & xn & "'")
                Total = .Compute("sum(综合合价)", "序列号 ='" & xn & "'")
            End With
            cost = DataTables("人材机明细").Compute("sum(不含税合价)","序列号 ='" & xn & "'")
            
            dr("工程量_数量") = amount
            dr("合计_收入") = total
            dr("单价_收入") = total / amount
            
        Next
    End If
End If

5、最后学会自行调试,http://www.foxtable.com/webhelp/scr/1485.htm,看哪一句代码出错

 回到顶部