Foxtable(狐表)用户栏目专家坐堂 → [求助]MainTableChanging事件


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

主题:[求助]MainTableChanging事件

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


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
[求助]MainTableChanging事件  发帖心情 Post By:2016/8/14 11:43:00 [只看该作者]

'****************************************************************************************************
'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
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
  发帖心情 Post By:2016/8/14 11:45:00 [只看该作者]

DataTables(e.OldTableName).Save()语句前后加上代码暂停和重新执行,结果还是和原来一样

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


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
  发帖心情 Post By:2016/8/14 12:14:00 [只看该作者]

找着问题所在了

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/8/14 13:18:00 [只看该作者]

beforesavedatarow事件,是针对每一行保存的,只要你有一行正确保存,可能就会设置 _saveOk = True 了

 

建议改一下判断

 

If DataTables(e.OldTableName).HasChanges Then

    msgbox("没保存")

End If


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


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
  发帖心情 Post By:2016/8/14 15:14:00 [只看该作者]

好的

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


加好友 发短信
等级:四尾狐 帖子:995 积分:6712 威望:0 精华:0 注册:2015/1/12 22:12:00
  发帖心情 Post By: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,造成新增行不判断,表中会出现空行,请问如何处理?


 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By: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


 回到顶部