以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [求助]MainTableChanging事件 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=89032) |
-- 作者:lzzhx -- 发布时间:2016/8/14 11:43:00 -- [求助]MainTableChanging事件 \'**************************************************************************************************** \'MainTableChanging \'切换主表前执行,也就是MainTable发生变化前执行 \'==================================================================================================== If DataTables(e.OldTableName).HasChanges = True Then Dim Result As DialogResult Result = MessageBox.Show(e.OldTableName & "数据已修改且未保存,现在保存吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) If Result = DialogResult.Yes Then _saveOK = False DataTables(e.OldTableName).Save() If _saveOK = False Then e.Cancel = True MessageBox.Show("_saveOK =" & _saveOK ) End If Else e.Cancel = True End If End If \'**************************************************************************************************** 以上代码是MainTableChanging事件代码,另外在DataTables(e.OldTableName)表的beforesavedataror事件中设置了当保存后_saveOK为true,未完成保存就为false. 目前存在以下问题: 在老主表有数据未保存,人工切换到新主表时,会提示是否保存老主表,当点击对话框 否 时,程序正常,主表保持在老主表上,当 点击对话框 是 时,开始保存老主表,若老主表未正常保存,将变量_saveOK置为false,正常应该是不能将主表切换到新主表上去,但不知什么原因,明明_saveOK = False ,但主表还是切换到新主表去了,请老师看看是什么原因? |
-- 作者:lzzhx -- 发布时间:2016/8/14 11:45:00 -- 在DataTables(e.OldTableName).Save()语句前后加上代码暂停和重新执行,结果还是和原来一样 |
-- 作者:lzzhx -- 发布时间:2016/8/14 12:14:00 -- 找着问题所在了 |
-- 作者:大红袍 -- 发布时间:2016/8/14 13:18:00 -- beforesavedatarow事件,是针对每一行保存的,只要你有一行正确保存,可能就会设置 _saveOk = True 了
建议改一下判断
If DataTables(e.OldTableName).HasChanges Then msgbox("没保存") End If |
-- 作者:lzzhx -- 发布时间:2016/8/14 15:14:00 -- 好的 |
-- 作者:lzzhx -- 发布时间:2016/8/14 15:21:00 -- 请老师把下面的内部函数完善一下: \'**************************************************************************************************** \'SaveOK \'该函数加在表的BeforeSaveDataRow事件中调用,用来进行必填数据控制 \'调用方法 如: Functions.Execute("SaveOK",e,"部门编号|部门名称","公司部门表) \'====已用============================================================================================ Dim e As Object = args(0) \'e参数传递 Dim DataColNames As String = args(1) \'要判断必填字段的列名,多列用|分开 Dim tb As Table = Tables(args(2)) \'传递Table名称 If e.DataRow.RowState <> DataRowstate.Added Then If DataColNames.Length > 0 Then Dim ArrDataColName() As String = DataColNames.Split("|") \'将多条件列变为数组 For i As Integer = 0 To ArrDataColName.Length-1 If e.DataTable.DataCols.Contains(ArrDataColName(i)) Then If e.DataRow.IsNull(ArrDataColName(i))= True MessageBox.Show("【" & ArrDataColName(i) & "】的值不能为空!","存盘失败",MessageBoxButtons.OK,MessageBoxIcon.Exclamation) \'提示用户 Dim Index As Integer = tb.FindRow(e.DataRow) If Index > -1 Then \'如果找到此行 tb.Position = Index \'将焦点定位到此行 End If _saveOK = False e.Cancel = True \'取消存盘 Exit For Else _saveOK = True End If Else MessageBox.Show("数据表【" & e.DataTable.name & "】没有列名称为[" & ArrDataColName(i) & "]的数据列!" & vblf & "请联系系统管理员!","存盘失败",MessageBoxButtons.OK,MessageBoxIcon.Exclamation) _saveOK = False e.Cancel = True \'取消存盘 Exit For End If Next End If End If \'**************************************************************************************************** 目的:当行是新增时,因为要及时保存以获得唯一编号,因此不进行空值判断,现在的问题是: 如果有新增行,且新增行没有任何改变,但其它行有变化需要保存,或要改变主表,由于新增行的状态还是 added,造成新增行不判断,表中会出现空行,请问如何处理? |
-- 作者:大红袍 -- 发布时间:2016/8/14 16:42:00 -- 如果需要加上新增行,这句代码就要去掉
If e.DataRow.RowState <> DataRowstate.Added Then
MainTableChanged事件不需要判断 _saveOk 的值的,直接判断两次HasChanged即可
If DataTables(e.OldTableName).HasChanges Then DataTables(e.OldTableName) If DataTables(e.OldTableName).HasChanges Then msgbox("没保存成功") End If End If |