程版主,下面是我优化过的权限控制代码,实际上可以放在其它的for each……next语句中,以减少循环。
您的代码不是来自您的程序,所以只有先设置列不可查阅不可编辑的代码,却没有设置列可查阅可编辑的代码。当然比我的简化多了。
'初始化:所有的表都不可见,不可编辑,不可粘贴,相当于定义了所有的列都不可见,不可编辑
'表不可见肯定列不可见,列不可见肯定列无法编辑;表不能编辑肯定列也不能编辑
'故在<权限管理>表授权时,只需授权表可见和可编辑,即可恢复列可见和列可编辑,此时无需指明哪些列可见可编辑
'但对于不可见的少量列和不允许编辑的少量列须在权限表中一一列示
'所以,本段代码适合于列比较少的表,更适合于全表只有(不)可见和(不)可编辑的情况
For Each dt As DataTable In DataTables
dt.AllowClipBoard=False '禁止复制粘贴
Next
For Each dt As Table In Tables
dt.Visible = False
dt.AllowEdit = False
Next
'对于列数很多(如100列)的<项目管理>表,不可见的列很少,可参照上述设置方法单独列示,
'但一一列示不允许编辑的列及其对应的角色就显得非常啰嗦,所以在此先设置都不可编辑,
'然后在授权表中先按权限设置表可见可编辑可复制粘贴,再设置不可见不可编辑的列,
'最后逐列设置都可见且都可编辑
For Each dc As Col In Tables("项目管理").Cols
dc.AllowEdit = False
Next
'进行权限管理
Dim drs As List (of DataRow)
Dim roles(),role,values() As String
roles=_userroles.split(",")
For index As Integer = 0 To roles.length-1
role="'*" & roles(index) & "*'"
drs = DataTables("权限管理").Select("角色名称 like " & role,"序号")
For Each dr As DataRow In drs
If dr.IsNull("列名")=True Then '程版主将true改成了false,根本没有考虑true是控制表的可查阅可编辑可粘贴,而false(即后续的else)是控制列的。且没有下段else,是不合适的。
Tables(dr("表名")).Visible =dr("可查阅")
Tables(dr("表名")).AllowEdit =dr("可编辑")
If dr("表名").Contains(".") Then '说明是关联表,是table,不是datatable,没有AllowClipBoard属性
Continue For
Else
DataTables(dr("表名")).AllowClipBoard =dr("可粘贴")
End If
Else '以下是被程版主省略但实际上是不能省略的代码
Values = dr("列名").split(",")
For I1 As Integer = 0 To Values.Length - 1
Tables(dr("表名")).cols(Values(I1)).Visible = dr("可查阅")
Tables(dr("表名")).cols(Values(I1)).AllowEdit = dr("可编辑")
Next
End If
Next
Next
可见,先设置不可见不可编辑对于列数较少的表是有利的,也是容易理解的,但一旦出现列数较多、角色较多的表就有问题了,
虽然编程容易,编程者也清楚授权过程,但对实际的授权者来说不是那么容易理解的。
如果先设置可见可编辑,那么,不管列数多少角色多少,只要让授权者明了应该设置哪些角色不能查阅、不能编辑哪些表和列就简单多了。
[此贴子已经被作者于2012-10-31 0:07:50编辑过]