以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  对用户编辑修改动作的记录跟踪  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=3990)

--  作者:reachtone
--  发布时间:2009/8/22 11:41:00
--  对用户编辑修改动作的记录跟踪
    为了实现对每人编辑修改记录的跟踪功能,我在datacolchanged事件中设置了以下事件。

Dim dr As DataRow = e.DataRow
If dr.RowState <> DataRowState.Added \'如果不是新增加的行
    dr("操作记录") = dr("操作记录") & Chr(13) & Chr(10) & date.Now & "  【" & User.Name & "】将 〖" & e.DataCol.Name & "〗中的 <" & dr(e.DataCol.Name) & "> 修改成了 <" & e.NewValue & ">"
End If

    我本来的想法是,只要在表中修改了数据,或者通过查找替换等方式修改了数据,都在“操作记录”中记录相关内容。但郁闷的是,现在只要在表中修改数据,项目就会崩溃。看这个例子,只有几行数据而已。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目1.table

[此贴子已经被作者于2009-8-22 12:55:31编辑过]

--  作者:czy
--  发布时间:2009/8/22 12:28:00
--  
这是正常的,正确应该是:

\'跟踪每个人的编辑修改记录
Dim dr As DataRow = e.DataRow
if e.DataCol.Name <> "操作记录" Then
    If dr.RowState <> DataRowState.Added \'如果不是新增加的行
        dr("操作记录") = dr("操作记录") & Chr(13) & Chr(10) & date.Now & "  【" & User.Name & "】将 〖" & e.DataCol.Name & "〗中的 <" & dr(e.DataCol.Name) & "> 修改成了 <" & e.NewValue & ">"
    End If
End If

--  作者:reachtone
--  发布时间:2009/8/22 12:40:00
--  
以下是引用czy在2009-8-22 12:28:00的发言:
这是正常的,正确应该是:

\'跟踪每个人的编辑修改记录
Dim dr As DataRow = e.DataRow
if e.DataCol.Name <> "操作记录" Then
    If dr.RowState <> DataRowState.Added \'如果不是新增加的行
        dr("操作记录") = dr("操作记录") & Chr(13) & Chr(10) & date.Now & "  【" & User.Name & "】将 〖" & e.DataCol.Name & "〗中的 <" & dr(e.DataCol.Name) & "> 修改成了 <" & e.NewValue & ">"
    End If
End If

哈哈,厉害,C版就是高手!
如果不加e.DataCol.Name <> "操作记录" 判断的话,该列会永远被修改,从而陷入死循环。
还有个问题,在DataColChanged里好象是得不到原值的,估计要把这个代码放到DataColChanging里了。


--  作者:czy
--  发布时间:2009/8/22 12:43:00
--  
以下是引用reachtone在2009-8-22 12:40:00的发言:


还有个问题,在DataColChanged里好象是得不到原值的,估计要把这个代码放到DataColChanging里了。


没错,老六前不久说过,判断原值只能在DataColChanging事件中。


--  作者:reachtone
--  发布时间:2009/8/22 12:45:00
--  
以下是引用czy在2009-8-22 12:43:00的发言:


没错,老六前不久说过,判断原值只能在DataColChanging事件中。

OK,已经搞定。
多谢C版!


--  作者:mr725
--  发布时间:2009/8/22 14:44:00
--  

对楼主和c版的代码增加加一个  if.....end if  。 不然("操作记录") 列中每行因为【& Chr(13) & Chr(10) &】都有个‘小空行’(当然,就希望如此的话,就别加了~  呵呵 )
Dim dr As DataRow = e.DataRow
if e.DataCol.Name <> "操作记录" Then
    If dr.RowState <> DataRowState.Added \'如果不是新增加的行
        If dr("操作记录") = "" then      
            dr("操作记录") = date.Now & "  【" & User.Name & "】将 〖" & e.DataCol.Name & "〗中的 <" & dr(e.DataCol.Name) & "> 修改成了 <" & e.NewValue & ">"
        else
            dr("操作记录") = dr("操作记录") & Chr(13) & Chr(10) & date.Now & "  【" & User.Name & "】将 〖" & e.DataCol.Name & "〗中的 <" & dr(e.DataCol.Name) & "> 修改成了 <" & e.NewValue & ">"
        End If
    End If
End If

另外,操作记录 列是不是用一个 操作记录 表来替代更好(还可定期清理掉)。~ 这也有利于恢复到修改前的状况,且第一次保存前根本不需要记录的~ ······对不?


--  作者:mr725
--  发布时间:2009/8/22 14:59:00
--  
以下是引用czy在2009-8-22 12:43:00的发言:


没错,老六前不久说过,判断原值只能在DataColChanging事件中。

请教 : 下面代码(原想放在datacolchanged里,但项目崩溃了)应该放在那个事件中,或代码要怎么改?
If e.DataCol.Name = "字母列" Then    
    Dim s1 As String = currenttable(CurrentTable.Position,"字母列")   
    currenttable(CurrentTable.Position,"字母列") = s1.ToUpper()      ‘小写字母转成大写~
End If


--  作者:狐狸爸爸
--  发布时间:2009/8/22 15:05:00
--  
DataColChanging事件:

If e.DataCol.Name = "字母列" Then    
     e.NewValue = e.NewValue.ToUpper() 
End If

--  作者:mr725
--  发布时间:2009/8/22 15:09:00
--  
以下是引用狐狸爸爸在2009-8-22 15:05:00的发言:
DataColChanging事件:

If e.DataCol.Name = "字母列" Then    
     e.NewValue = e.NewValue.ToUpper() 
End If

ok!  谢谢啊~ 


--  作者:狐狸爸爸
--  发布时间:2009/8/22 15:34:00
--  
哈哈,看来六条尾巴也不管用,你还得加油啊。

从你这个代码可以看出,你还是没有掌握好DataTable和Table的差别。