不是有一个强制解锁的么?
5、将表事件BeforSaveDatarow代码设置为:
If e.DataRow.RowState = DataRowState.Added Then '如果是新增行
e.DataRow("编辑者") = Nothing
Else
Dim cmd As New SQLCommand
cmd.CommandText = "Update {员工} Set 编辑者 = Null Where [_Identify] = " & e.DataRow("_Identify")
If cmd.ExecuteNonQuery = 1 Then
e.DataRow("编辑者") = Nothing
End If
End If
上述代码在保存行之前,清除此行的编辑者列内容,也就是解锁此行。
你也许会奇怪,为什么新增行可以直接清空编辑者列的内容,但其它行要通过Update语句设置?
假定现有一行数据,用户张三双击此行某个单元格开始编辑,系统执行StartEdit事件,将编辑者列的内容设置为“张三”,后台此列的内容也通过 Update语句设置为了“张三”,如果此用户在编辑过程中,没有做任何修改,就选择了其他单元格,然后保存,此时如果在 BeforeSaveDataRow事件中直接清空编辑者列内容,那么此行所有列的内容和最初完全一样,Foxtable将不会保存此行,所以虽然你清空了编辑者列的内容,但是后台的编辑者列还是“张三”,导致记录被锁死。
这里涉及到Foxtable的保存机制:在保存某行之前,系统会进行一个判断,如果此行所有列内容和最初完全相同,则跳过此行,以提高保存效率。
6、最后设置BeforeCloseProject事件代码为:
Dim cmd As New SQLCommand
cmd.CommandText = "Update {员工} Set 编辑者 = Null Where 编辑者 = '" & User.Name & "'"
cmd.ExecuteNonQuery
这样在关闭项目前,将清除当前用户锁定的全部行。