以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]PrepareEdit执行代码目录树, 死机  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=47555)

--  作者:jnletao
--  发布时间:2014/3/12 13:51:00
--  [求助]PrepareEdit执行代码目录树, 死机

PrepareEdit 执行


If e.RecordGrid Is Nothing Then \'如果不是在记录窗口输入数据
    e.Cancel = True \'则取消输入
Else
    If e.IsFocusCell Then
        If e.Col.name = "项目类别" AndAlso e.Row("收付") = 1 Then
            Dim tb As New DropTreeBuilder
            tb.SourceTable = DataTables("基础类别") \'指定目录树表
            tb.TreeCols = "{类别归属}" \'指定用于生成目录树的列,用大括号括起来
            tb.SourceCols = "类别名称"   \' 字符型,指定数据来源列
            tb.ReceiveCols = "项目类别" \'指定数据接收列
            tb.TreeFilter = "[级别] > 0 And SubString([类别归属],1,6) = \'收费项目类别\'"
            tb.PathSeparator = "\\" \'指定路径分割符号
            e.Col.DropTree = tb.Build()
        End If
    End If
End If


在记录窗口 操作下拉目录树后,系统菜单 全黑,不报错,但是软件死机,只能结束进程

--  作者:Bin
--  发布时间:2014/3/12 14:21:00
--  
上个例子看看.
--  作者:jnletao
--  发布时间:2014/3/12 14:53:00
--  
单独 例子 测试正常, 不过我查看正个项目代码也没发现与 它有 冲突的 地方
--  作者:Bin
--  发布时间:2014/3/12 14:55:00
--  
全局表事件看看,肯定有冲突的地方.  或者是数据有问题.
--  作者:jnletao
--  发布时间:2014/3/12 15:10:00
--  
关键是不报错呀,CPU 瞬间 100%了,
这是于它可能有关的代码

MainTableChanging

 

Dim frm As WinForm.Form = Forms.ActiveForm

If frm IsNot Nothing Then

    If  DataTables(e.OldTableName).HasChanges Then

        Messagebox.Show("你的" & e.OldTableName & "还有记录未保存," & vbcrlf & "请先保存(或撤销)后再切换至其它窗口!","保存提示",MessageBoxButtons.OK,MessageBoxIcon.Information)

        e.Cancel = True

    End If

End If


全局表事件

DataColChanged

 

Dim IPAdress As System.Net.IPAddress

Dim HostName As String

Dim nics() As System.Net.NetworkInformation.NetworkInterface = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces

Dim NetMac = nics(0).GetPhysicalAddress.Tostring \'获取网卡MAC  HardDiskId 硬盘ID ComputerId机器码

HostName = System.Net.Dns.GetHostName \'获得本机的机器名

IPAdress = System.Net.Dns.GetHostByName(HostName).AddressList.GetValue(0) \'获得本机的IP

 

If e.DataTable.Name <> "操作日志" And e.DataTable.Name <> "IC卡激活临时表" And e.DataTable.Name <> "导出专用临时表" Then

    If e.DataRow.RowState <> DataRowState.Added  And e.OldValue IsNot Nothing Then

        Dim dr As DataRow = DataTables("操作日志").AddNew

        dr("用户") = User.Name

        dr("IP") = IPAdress.ToString

        dr("MAC") = NetMac

        dr("涉及表") = e.DataTable.Name

        dr("涉及列") = e.DataCol.Name

        dr("涉及行") = e.DataRow("_Identify")

        dr("日期") = Date.Now

        dr("时间") = Date.Now

        dr("执行操作") = """" & e.OldValue &  """ 改成了 """ & e.NewValue & """"

        dr("类型") = "修改"

        dr("原始数据") = "不记录"

    End If

End If

 

DataRowDeleting

 

Dim IPAdress As System.Net.IPAddress

Dim HostName As String

Dim nics() As System.Net.NetworkInformation.NetworkInterface = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces

Dim NetMac = nics(0).GetPhysicalAddress.Tostring \'获取网卡MAC  HardDiskId 硬盘ID ComputerId机器码

HostName = System.Net.Dns.GetHostName \'获得本机的机器名

IPAdress = System.Net.Dns.GetHostByName(HostName).AddressList.GetValue(0) \'获得本机的IP

 

If e.DataTable.Name <> "操作日志" And e.DataTable.Name <> "IC卡激活临时表" And e.DataTable.Name <> "导出专用临时表" Then

    If e.DataRow.RowState <> DataRowState.Added  Then

        Dim dr As DataRow = DataTables("操作日志").AddNew

        dr("用户") = User.Name

        dr("IP") = IPAdress.ToString

        dr("MAC") = NetMac

        dr("涉及表") = e.DataTable.Name

        dr("涉及列") = "所有列"

        dr("涉及行") = e.DataRow("_Identify")

        dr("日期") = Date.Now

        dr("时间") = Date.Now

        dr("执行操作") = "整行删除"

        dr("类型") = "删除"

        Dim str As String = ""

        For Each c As DataCol In e.DataTable.DataCols

            str += c.Name & "=" & e.DataRow(c.Name) & vbcrlf

        Next

        dr("原始数据") = str

    End If

End If




--  作者:jnletao
--  发布时间:2014/3/12 15:11:00
--  

这是最相关的。

费用项目_PrepareEdit

 

If Forms("费用项目").Opened Then

    If e.RecordGrid Is Nothing Then \'如果不是在记录窗口输入数据

        e.Cancel = True \'则取消输入

    Else

        If e.IsFocusCell Then

            If e.Col.name = "项目类别" AndAlso e.Row("收付") = 1 Then

                Dim tb As New DropTreeBuilder

                tb.SourceTable = DataTables("基础类别") \'指定目录树表

                tb.TreeCols = "{类别归属}" \'指定用于生成目录树的列,用大括号括起来

                tb.SourceCols = "类别名称"   \' 字符型,指定数据来源列

                tb.ReceiveCols = "项目类别" \'指定数据接收列

                tb.TreeFilter = "[级别] > 0 And SubString([类别归属],1,6) = \'收费项目类别\'"

                tb.PathSeparator = "\\" \'指定路径分割符号

                \' e.Col.DropTree = tb.Build()

                Tables("费用项目_TableMoney").Cols("项目类别").DropTree = tb.Build()

            End If

        End If

    End If

End If

 

费用项目_DataColChanging

 

Select Case e.DataCol.Name

    Case "流程顺序"

        If e.DataRow("是否流程") And e.NewValue IsNot Nothing Then

            Dim dr As DataRow

            dr = e.DataTable.Find("流程顺序 = " & e.NewValue & "")

            If dr IsNot Nothing Then

                MessageBox.Show("此流程号已经存在!")

                e.Cancel = True

            End If

        ElseIf e.DataRow("是否流程") = False And e.NewValue IsNot Nothing Then

            If e.NewValue > 0 And e.NewValue <> 9999 Then

                MessageBox.Show("非流程项目设定流程顺序有特殊要求,具体请参考使用说明书!","操作提示",MessageBoxButtons.OK,MessageBoxIcon.Error)

                e.Cancel = True

            End If

        End If

    Case "项目名称"

        Dim dr As DataRow

        dr = e.DataTable.Find("项目名称 = \'" & e.NewValue & "\'")

        If dr IsNot Nothing Then

            MessageBox.Show("已存在此项目,不能重复添加!","操作提示",MessageBoxButtons.OK,MessageBoxIcon.Error)

            e.Cancel = True

        End If

    Case "代收费标准"

        If e.DataRow("是否代收费") = False Or e.DataRow.IsNull("代收费方式") Then

            MessageBox.Show("请先勾选是否代收费并选取代收费方式!","操作提示",MessageBoxButtons.OK,MessageBoxIcon.Error)

            e.Cancel = True

        Else

            If  e.DataRow("代收费方式") = "比例" And e.NewValue > 1 Then

                MessageBox.Show("代收费方式为比例时标准不能大于1","操作提示",MessageBoxButtons.OK,MessageBoxIcon.Error)

            End If

        End If

    Case "费用单价"

        If e.DataRow("固定收费") Then

            MessageBox.Show("固定收费,不可变更!","操作提示",MessageBoxButtons.OK,MessageBoxIcon.Error)

            e.Cancel = True

        End If

End Select

 

费用项目_DataColChanged

 

Select Case e.DataCol.Name

    Case  "是否流程"

        If e.DataRow("是否流程") = False   Then

            e.DataRow("流程顺序") = Nothing

            e.DataRow("年审审核") = False

            e.DataRow("记录仪审核") = False

            e.DataRow("保险审核") = False

        End If

    Case "年审审核","记录仪审核","保险审核"

        If e.DataRow("是否流程") = False And e.DataRow(e.DataCol.Name) = True Then

            MessageBox.Show("只有流程项目才能审核!")

            e.DataRow(e.DataCol.Name) = False

        End If

End Select

 



--  作者:jnletao
--  发布时间:2014/3/12 15:11:00
--  

费用项目_BeforeSaveDataRow

 

Dim Dcount As Byte = e.DataTable.Compute("Count(是否流程)", "是否流程 = True")

Dim DMax As Byte = e.DataTable.Compute("Max(流程顺序)", "是否流程 = True")

 

If Dcount <> DMax Then

    MessageBox.Show("流程顺序有断号,请确保流程顺序是连续的","保存失败",MessageBoxButtons.OK,MessageBoxIcon.Error)

    e.Cancel = True

End If

 

If e.DataRow.IsNull("项目类别") Then

    MessageBox.Show("请为【" & e.DataRow("项目名称") & "】设定项目类别","保存失败",MessageBoxButtons.OK,MessageBoxIcon.Error)

    e.Cancel = True

End If

 

If e.DataRow.IsNull("费用单价") Then

    MessageBox.Show("请为【" & e.DataRow("项目名称") & "】设定单价","保存失败",MessageBoxButtons.OK,MessageBoxIcon.Error)

    e.Cancel = True

End If


窗体表事件

费用项目_AfterLoad

 

Tables("费用项目_TableMoney").SetHeaderRowHeight(31)

Tables("费用项目_TableMoney").Grid.ExtendLastCol = True

Tables("费用项目_TableMoney").LeftVisibleCol = 0

 

Tables("费用项目_TableMoney").Sort = "是否流程 Desc,流程顺序"

 

Dim tr As WinForm.TreeView = e.Form.Controls("TreeView1")

tr.CreateTree("基础类别","类别归属","\\","级别 > 0 And SubString([类别归属],2,5) = \'费项目类别\'")

 

Dim rgd As WinForm.RecordGrid = e.Form.Controls("RecordGrid1")

rgd.Table = Tables("费用项目_TableMoney") \'指定绑定表

rgd.Build() \'重新生成记录窗口

 

 

\'Dim ComboType As WinForm.ComboBox = e.Form.Controls("ComboType")

\'ComboType.ComboList = DataTables("基础类别").GetComboListString("类别名称", "[级别] = 1 And SubString([类别归属],1,6) = \'收费项目类别\'") & "|所有项目类别"


--  作者:Bin
--  发布时间:2014/3/12 15:12:00
--  
是不是有关,注译一下再测试就一目了然了.
--  作者:jnletao
--  发布时间:2014/3/12 15:29:00
--  
以上代码 全注释 掉了,问题依旧,
其它编辑操作正常,只在窗体操作目录树后 出现死机,
具体操作是 单击记录窗控件 列目录树出现下拉也是正常的,不过如果单击选中节点赋值后,CPU快速上升,死机 

--  作者:Bin
--  发布时间:2014/3/12 15:31:00
--  
检查 DataColChanged 或者DataColChangING 事件 应该是赋值之后触发值改变然后执行了大量运算.