Foxtable(狐表)用户栏目专家坐堂 → [建议]恳请狐爸核实或解释table对datatable的继承性问题


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

主题:[建议]恳请狐爸核实或解释table对datatable的继承性问题

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


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
[建议]恳请狐爸核实或解释table对datatable的继承性问题  发帖心情 Post By:2012/10/20 13:00:00 [显示全部帖子]

帮助文件指出:

1、如果Table没有设置过该属性的值,那么从DataTable继承,如果Table已经设置了该属性的值,那么以Table的设置为准。

2、只有不同的Table需要不同的设置时,才需要使用Table的设置属性,否则直接用DataTable的设置属性即可。

3、实际上DataTable本身是不能编辑的,因为用户根本就看不到DataTable,用户能编辑的只能是Table,所以AllowEdit属性本应该只出现在Table中, DataTable之所以也提供这个属性,只是为了统一设置的方便。

 

可见,为了同时设置关联表的属性,应该用datatable,否则很啰嗦。

于是,我在自定义用户登录后,根据角色授权时使用了datatable,没用table,结果导致权限控制无效,而帮助文件的例子却是只用table没用datatable。为什么此时用datatable会失效呢?

 

因此,恳请狐爸核实或解释table对datatable的继承性问题。

[此贴子已经被作者于2012-10-21 19:03:37编辑过]

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


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2012/10/26 13:49:00 [显示全部帖子]

AfterOpenProject事件中:

Forms("用户登录").Open()
If _UserName = "" Or _userroles="" Or _usergroup="" Then
    Syscmd.Project.Exit()
    Return
End If

'初始化:所有的表和列都可见和可编辑,可粘贴
For Each dt As DataTable In DataTables
    dt.AllowEdit = True
    dt.AllowClipBoard=True
Next
For Each t As Table In Tables
    t.Visible = True
    t.AllowEdit = True
    For Each c As Col In t.Cols
        c.Visible = True
        c.AllowEdit = True
    Next
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
            Tables(dr("表名")).Visible =dr("可查阅")
            DataTables(dr("表名")).AllowEdit =dr("可编辑")
            Tables(dr("表名")).AllowEdit =dr("可编辑")  ’必须加这句,否则失效
            DataTables(dr("表名")).AllowClipBoard =dr("可粘贴")
        Else
            Values = dr("列名").split(",")
            For I1 As Integer = 0 To Values.Length - 1
                Tables(dr("表名")).cols(Values(I1)).Visible = dr("可查阅")
                DataTables(dr("表名")).datacols(Values(I1)).AllowEdit = dr("可编辑")
                Tables(dr("表名")).cols(Values(I1)).AllowEdit = dr("可编辑")  ’必须加这句,否则失效
            Next
        End If
    Next
Next


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


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2012/10/28 14:02:00 [显示全部帖子]

Tables(dr("表名")).cols(Values(I1)).AllowEdit = dr("可编辑") ——可以控制主表

DataTables(dr("表名")).datacols(Values(I1)).AllowEdit = dr("可编辑")——不能控制关联表

 


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


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2012/10/29 18:29:00 [显示全部帖子]

谢谢版主的热心解答。我发现问题所在了:因为所有的关联表都是table,而不是datatable,所以,权限管理表的“表名”列应该包含关联表名,但关联表较多或权限复杂时这样做就太啰嗦,可先找出所有的关联表,然后在代码中参照主表批量处理。

但存在几个问题:

1、AllowClipBoard 不是table的成员,Tables(dr("表名")).AllowClipBoard =dr("可粘贴") 是错的,前面必须加“data”,所以我的初始化不啰嗦。

2、即使用户登录出现问题,仍然可用“If _UserName = "" Or _userroles="" Or _usergroup="" Then ”来控制退出,所以本段代码不应放在登录中。
3、版主的代码是表、列先不可查阅、不可编辑,那么后面只恢复了表可查阅、可编辑,并没有恢复列可查阅,结果无法编辑。所以,我的权限管理代码也不啰嗦。同时,权限管理表中“列名”列为空时,如果要恢复列可查阅,则还要增加所有列的可查阅、可编辑代码,比我的代码还啰嗦。

4、用户登录可做成通用的。因此,权限管理代码如果放在登录中,则因存在后来才加载的表视图,不可查阅的列也就成了可查阅的了。除非所有代码都放在登录中,且权限控制在加载表视图之后。

因此,我认为表、列先可查阅、可编辑是比较好的选择。


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


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2012/10/31 0:03:00 [显示全部帖子]

程版主,下面是我优化过的权限控制代码,实际上可以放在其它的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编辑过]

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


加好友 发短信
等级:四尾狐 帖子:977 积分:6835 威望:0 精华:0 注册:2012/4/2 21:49:00
  发帖心情 Post By:2012/10/31 12:33:00 [显示全部帖子]

程版主,我的表结构是序号、角色名称(多值)、表名(单值)、列名(多值)、可查阅、可编辑、可粘贴。您的表结构和代码可否分享一下?

 


 回到顶部