Foxtable(狐表)用户栏目专家坐堂 → 独占编辑


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

主题:独占编辑

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


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2018/2/5 8:46:00 [只看该作者]

这是左上角的刷新按钮,所有的表点它都可以刷新当前数据。


代码如下:
   Dim t As Table = CurrentTable
   Dim temp As String = t.Filter
   t.DataTable.Load
   t.Filter = temp

如果此时某人打开这个"文件协作表"中的附件进行编辑, 则"编辑者"字段会填上该人的名字,这个没有问题。  问题是:  如果是打开者本人点“刷新”按钮,则编辑者会消失(我查看了,打开附件时编辑者的名字也写到数据库的表中“编辑者”字段了,刷新后数据库中的这个字段也被清除了),这是怎么回事呢?
[此贴子已经被作者于2018/2/6 8:32:27编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/2/5 9:05:00 [只看该作者]

1、你是如何给【编辑者】那一列赋值的?用什么代码处理?

 

2、去看看你beforeLoad和afterLoad事件的代码,看是否有影响。

 

3、不然就做个对应例子发上来测试。


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


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2018/2/5 10:12:00 [只看该作者]

发现是点刷新按钮的时候,触发了 BeforSaveDataRow事件,怎么会这样呢? 要怎么改?

'文件协作相关代码
If e.DataRow.RowState = DataRowState.Added Then '如果是新增行
'msgbox("新增行")
    e.DataRow("编辑者") = Nothing
Else     '如果只是普通行点保存
'msgbox("已有行")
    Dim cmd As New SQLCommand
    cmd.C
    cmd.CommandText = "U pdate {文件协作表} Set 编辑者 = Null Where [_Identify] = " & e.DataRow("_Identify")
    If cmd.ExecuteNonQuery = 1 Then
        e.DataRow("编辑者") = Nothing
    End If
End If

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/2/5 10:15:00 [只看该作者]

你是如何给【编辑者】那一列赋值的?用什么代码处理?

 

你可以把t.DataTable.Load改成t.DataTable.Load(false)


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


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2018/2/5 10:19:00 [只看该作者]

在BeforeOpenFile事件之中:



'文件协作相关代码

If user.Group="管理员"  Then
Dim str_FileName As String =e.FileName
str_FileName=str_FileName.TrimStart("//")

Dim str_path="\\172.16.11.5\pm文件\test\" & str_FileName


Dim cmd As New SQLCommand
cmd.C
cmd.CommandText = "S elect 编辑者 From {文件协作表} Where [_Identify] = " & e.DataRow("_Identify")
Dim nm As String = cmd.ExecuteScalar

'msgbox(nm)
If nm>"" And  e.DataRow("编辑者") = User.Name Then '如果编辑者不为空 且 编辑者是当前用户,则退出此事件 
     e.Cancel=True 
     Return

Else If nm > "" And e.DataRow("编辑者")<>User.Name  Then     '如果查询的编辑者字段不为空,且编辑者字段不是当前用户
        
      MessageBox.show(nm & "正在编辑此行,你不能同时编辑!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
      e.Cancel=True    '禁止文件管理器打开附件
'Else If nm= ""  Then     
'        MessageBox.show("此行可能已经被删除,无法编辑!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
Else If nm = "" And e.DataRow.RowState <> DataRowState.Added     '如果等于当前编辑者的记录没有查询到 且 当前行不是新增行,则把当前编辑者插入进去
 
     Dim exp As String  = "编辑者 Is Null And [_Identify] = " & e.DataRow("_Identify")
     cmd.C
     cmd.CommandText = "U pdate {文件协作表} Set 编辑者 = '" & User.Name & "' Where " & exp

     If cmd.ExecuteNonQuery = 1 Then   '如果在数据库中字段成功写入编辑者
        e.DataRow("编辑者") = User.Name     '在显示的表中也改一下

     '以下为打开附件列中的附件
      If e.DataCol.Name = "附件" Then    '如果鼠标操作的是附件列
            If vars("ls").ContainsKey(e.DataRow("_identify")) Then      '如果vars("ls")字典包含  当前列的  序列号
               Vars("ls")(e.DataRow("_identify")) = system.Diagnostics.Process.Start(str_path)
            Else             '如果不包含
               Vars("ls").add(e.DataRow("_identify"),system.Diagnostics.Process.Start(str_path))
            End If   
            'msgbox(1) 
            e.Cancel = True '取消系统默认的打开文件操作,因为前面已经编码打开了       '成功也要取消打开文件,下面的失败也要取消,因为已经用代码打开了,不再需要文件管理器自动打开
      End If
     End If
 
End If

End If    '如果当前用户是管理员

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/2/5 10:23:00 [只看该作者]

把t.DataTable.Load改成t.DataTable.Load(false)

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


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2018/2/5 10:23:00 [只看该作者]

不行

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/2/5 10:26:00 [只看该作者]

t.DataTable.Load(false) 不会导致触发beforeSaveDataRow事件。

 

或者,你在表格、项目的各个事件,加入msgbox,看触发了哪些事件代码?然后注释掉测试。

 

不会做,做个例子发上来。


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


加好友 发短信
等级:六尾狐 帖子:1218 积分:8451 威望:0 精华:0 注册:2016/2/2 21:52:00
  发帖心情 Post By:2018/2/5 10:46:00 [只看该作者]

和定时器清空编辑者有关,可是文件明明是打开在呀

For Each key As String In vars("ls").keys
    try
       '如果是当前用户退出编辑文档,则try语句可以正常执行
        vars("ls")(key).ExitTime 
        Dim dr As DataRow= DataTables("文件协作表").SQLFind("[_identify]=" & key )     
        '以下代码为删除关闭的文件的编辑人  ,
         If dr IsNot Nothing AndAlso dr("编辑者")=User.Name Then        ' 如果编辑者是当前用户(表示是当前用户退出了编辑文档),则修改当前编辑者为空
         Dim cmd As New SQLCommand
         cmd.C
         cmd.CommandText = "U pdate {文件协作表} Set 编辑者 = Null Where [_identify] = " & key            ' e.DataRow("_Identify")
            If cmd.ExecuteNonQuery = 1 Then
               '  e.DataRow("编辑者") = Nothing
               'Dim dr As DataRow= DataTables("员工").SQLFind("_identify='" & key & "'"   )
             msgbox("定时器清空编辑者")
               dr("编辑者")=Nothing
            End If
         End If 
      '  msgbox(key & ":正常关闭,并删除编辑人")
    catch ex As exception    '如果当前用户没有退出编辑的文档,则执行以下代码
     '   msgbox(key & ":正常打开")
    End try
Next
[此贴子已经被作者于2018/2/5 10:46:19编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/2/5 10:52:00 [只看该作者]

在命令窗口执行下面代码,看弹出是否正确

 

For Each key As String In vars("ls").keys
    try
       '如果是当前用户退出编辑文档,则try语句可以正常执行
        vars("ls")(key).ExitTime 
        msgbox(key & ":正常关闭" & vars("ls")(key).ExitTime )
    catch ex As exception    '如果当前用户没有退出编辑的文档,则执行以下代码
        msgbox(key & ":正常打开")
    End try
Next

 回到顶部
总数 70 上一页 1 2 3 4 5 6 7 下一页