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


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

主题:[建议]恳请狐爸核实或解释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编辑过]

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


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2012/10/22 16:09:00 [只看该作者]

用简单的例子说话吧,或者具体点,失效体现在?

 

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
shenyl0211
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | 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


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


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By:2012/10/26 14:25:00 [只看该作者]

 测试正常,Datatalbes同样有效,不存在问题。

 回到顶部
帅哥哟,离线,有人找我吗?
shenyl0211
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | 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("可编辑")——不能控制关联表

 


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40556 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/10/28 14:34:00 [只看该作者]

您的代码太过啰嗦,请整理您的思维逻辑:

 

Forms("用户登录").Open()
If _UserName = "" Or _userroles="" Or _usergroup="" Then
    Syscmd.Project.Exit()
    Return
End If
'初始化:所有的表和列都可见和可编辑,可粘贴
For Each t As Table In Tables
    t.Visible = False
    t.AllowEdit = False
    For Each c As Col In t.Cols
        c.Visible = False
        c.AllowEdit = False
    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("列名")= False Then
            Tables(dr("表名")).Visible =dr("可查阅")
            Tables(dr("表名")).AllowEdit =dr("可编辑")
            Tables(dr("表名")).AllowClipBoard =dr("可粘贴")
        End If
    Next
Next


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40556 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/10/28 14:42:00 [只看该作者]

真正要实现逻辑管理,应该这样使用:

 

AfterOpenProject事件代码:

 

For Each t As Table In Tables
    t.Visible = False
    t.AllowEdit = False
    For Each c As Col In t.Cols
        c.Visible = False
        c.AllowEdit = False
    Next
Next
Forms("用户登录").Open()

 

【用户登录】窗口的“登录”按钮代码:

 

If _UserName = "" Or _userroles="" Or _usergroup="" Then
    Syscmd.Project.Exit()
    Return
End If
    '下面这一段加在【登录】按钮密码校验成功后执行的代码后面:
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("列名")= False Then
            Tables(dr("表名")).Visible =dr("可查阅")
            Tables(dr("表名")).AllowEdit =dr("可编辑")
            Tables(dr("表名")).AllowClipBoard =dr("可粘贴")
        End If
    Next
Next

 

 


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40556 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/10/28 14:58:00 [只看该作者]

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

    比如:您在建立表结构的时候,您并没有设置表、列的标题,而界面显示的是table,他就是从datatable继承过来的。

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

    比如:当不同的窗口的不同的table绑定了同一个datatable,他们都继承了datatable的属性,而根据您的需要却要动态设置这两个table的不同属性。

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

    这一条就不用解释了,您的这一条已经是一条再清楚不过的解释了。


 回到顶部
帅哥哟,离线,有人找我吗?
shenyl0211
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | 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、用户登录可做成通用的。因此,权限管理代码如果放在登录中,则因存在后来才加载的表视图,不可查阅的列也就成了可查阅的了。除非所有代码都放在登录中,且权限控制在加载表视图之后。

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


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


加好友 发短信 一级勋章
等级:超级版主 帖子:7235 积分:40556 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2012/10/29 18:33:00 [只看该作者]

您按照您的思路慢慢弄吧,我糊涂了!


 回到顶部
总数 13 1 2 下一页