以文本方式查看主题

-  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