以文本方式查看主题 - 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 事件 应该是赋值之后触发值改变然后执行了大量运算. |