以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  锁定单元格,并且保证其不被修改删除  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=171109)

--  作者:采菊东篱下
--  发布时间:2021/8/18 14:34:00
--  锁定单元格,并且保证其不被修改删除
  比如会计科目,它是规定不变的,凡系统原来的一级科目代码、一级科目名称都要保护其不被修改删除,但用户后期添加的一级科目代码、一级科目名称及其一级以下的科目代码、科目名称允许修改、删除,除科目代码、科目名称外的列都允许修改,我这样写
Dim r As DataRow = DataTables(vars("a")).Find("len(e.Row("科目代码")) = 4")
If e.Col.Name = "科目代码" OrElse e.Col.Name = "科目名称" Then
     e.Continue = False
End If
只是不允许其修改,但可以强行删除,如何做到保护它们不允许修改、删除,用AllowLockRow、Locked变成锁行,其他列想录入数据又不行了,这里只锁定符合条件的单元格,对了AllowLockRow、Locked两者有什么区别

--  作者:有点蓝
--  发布时间:2021/8/18 15:02:00
--  
prepareedit事件

If e.Col.Name = "科目代码" OrElse e.Col.Name = "科目名称" Then
     if e.row.isnull("科目代码") = false andalso e.row("科目代码").length = 4 then
e.cancel=true
end if
End If

不允许删除到BeforeDeleteDataRow事件处理

--  作者:采菊东篱下
--  发布时间:2021/8/18 15:56:00
--  
在BeforeDeleteDataRow事件中这样写报错:

图片点击可在新窗口打开查看此主题相关图片如下:22.png
图片点击可在新窗口打开查看
If e.DataCol.Name = "科目代码" OrElse e.DataCol.Name = "科目名称" Then
    If User.Type <> UserTypeEnum.Developer
        e.cancel = True
    End If
End If

--  作者:有点蓝
--  发布时间:2021/8/18 16:19:00
--  

BeforeDeleteDataRow

删除一行之前执行,可以在此处进行权限或逻辑验证,如果通不过验证,则撤销此次删除行操作。

e参数属性: 

DataTable:返回要删除行的数据表。
DataRow:  返回要删除的数据行。
Cancel:    逻辑型,设为True,取消删除行操作。
Continue: 逻辑型,设为False,取消后续删除行操作。

示例


--  作者:采菊东篱下
--  发布时间:2021/8/18 21:04:00
--  
BeforeDeleteDataRow
If User.Type <> UserTypeEnum.Developer And e.DataRow("操作人姓名").StartsWith = "开发者" And (e.DataRow("科目代码") OrElse e.DataRow("科目名称")) Then
    e.Cancel = True
End If
这是取消删除行,如果同时设置不允许删除列呢?
[此贴子已经被作者于2021/8/19 11:47:17编辑过]

--  作者:有点蓝
--  发布时间:2021/8/19 8:43:00
--  
删除列是开发功能,发布后就没有的,正常不需要考虑这个。