以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  权限设置报错“未引用实例对象”  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=123599)

--  作者:weibu
--  发布时间:2018/8/18 21:59:00
--  权限设置报错“未引用实例对象”
想实现点击打开窗口后,检索到授权表的职位中包含“管理者”的模块子模块对应的目录树的复选框打勾
老报错请帮忙看下
代码如下:Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1")
trv.BuildTree("授权","模块|子模块")
trv.ExpandAll()
Dim dr As DataRow
For Each nd As WinForm.TreeNode In trv.AllNodes
   dr = DataTables("授权").Find("模块 = \'" & nd.ParentNode.Name & "\' And 子模块 = \'" & nd.Name & "\'")
    Dim Str As String = dr("职位")
  If Str > "" AndAlso Str.Contains("管理者") Then
    nd.Checked = True
  End If
Next

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20180818215819.png
图片点击可在新窗口打开查看


图片点击可在新窗口打开查看此主题相关图片如下:报错.png
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:授权表.png
图片点击可在新窗口打开查看



--  作者:有点蓝
--  发布时间:2018/8/19 9:13:00
--  
Dim trv As WinForm.TreeView = e.Form.Controls("TreeView1")
trv.BuildTree("授权","模块|子模块")
trv.ExpandAll()
Dim dr As DataRow
For Each nd As WinForm.TreeNode In trv.AllNodes
    If nd.Level <> 0 Then \'第一层节点没有ParentNode
        dr = DataTables("授权").Find("模块 = \'" & nd.ParentNode.Name & "\' And 子模块 = \'" & nd.Name & "\'")
        Dim Str As String = dr("职位")
        If Str > "" AndAlso Str.Contains("管理者") Then
            nd.Checked = True
        End If
    End If
Next

--  作者:weibu
--  发布时间:2018/8/19 10:06:00
--  
好的,谢谢。我有串代码组织了两小时,没结果。想点击treeview1里面的afterchecknode事件。如果点击一级节点,把窗体combobox1的值写到授权表里,要求写到一级节点=授权表-模块列中的值的行;如果二级节点选中,写到授权表-模块-子模块对应的行?
--  作者:weibu
--  发布时间:2018/8/19 10:06:00
--  
如果取消复选框打勾,值相应去掉
组织的代码很乱,理不清:
If e.Node.ParentNode IsNot Nothing Then \'取消父节点的选中标记,因为选中子节点,就不要选中父节点了
    e.Node.ParentNode.Checked = False
End If
For Each nd As WinForm.TreeNode In e.Node.AllNodes
    nd.Checked  = e.Node.Checked
Next
Dim trv1 As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim nd1 As WinForm.TreeNode = trv1.SelectedNode
Dim dr As DataRow
If nd1.Level = 0 Then
    dr = DataTables("授权").Find("模块 = \'" & nd1.Name & "\'")
Else
    dr = DataTables("授权").Find("模块 = \'" & nd1.ParentNode.Name & "\' And 子模块 = \'" & nd1.Name & "\'")
End If
If dr IsNot Nothing Then
    Dim nms As String
    For Each nd2 As WinForm.TreeNode In trv1.AllNodes
        If nd2.Checked  Then
            nms  = nms & "," &  nd2.Name
        End If
    Next
    If nms > "" Then
        dr("职位") = nms.Trim(",")
    Else
        dr("职位") = Nothing
    End If
End If

Dim st As String = e.Form.Controls("ComboBox1").Value

[此贴子已经被作者于2018/8/19 10:10:35编辑过]

--  作者:有点蓝
--  发布时间:2018/8/19 10:09:00
--  
看这里的用法:http://www.foxtable.com/webhelp/scr/2405.htm

看不懂就上传具体实例

--  作者:weibu
--  发布时间:2018/8/19 10:31:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:微步溯源.foxdb


就是里面有个授权窗口,想点击treeview1里面的afterchecknode事件。如果点击一级节点,把窗体combobox1的值写到授权表里,要求写到一级节点=授权表-模块列中的值的行;如果二级节点选中,写到授权表-模块-子模块对应的行?

--  作者:有点蓝
--  发布时间:2018/8/19 10:59:00
--  
If e.Node.ParentNode IsNot Nothing Then \'取消父节点的选中标记,因为选中子节点,就不要选中父节点了
    e.Node.ParentNode.Checked = False
End If
For Each nd As WinForm.TreeNode In e.Node.AllNodes
    nd.Checked  = e.Node.Checked
Next
Dim st As String = e.Form.Controls("ComboBox1").Value
Dim trv1 As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim nd1 As WinForm.TreeNode = trv1.SelectedNode
Dim dr As DataRow
Dim Lst As new List(of String)
If nd1.Level = 0 Then
    For Each dr In DataTables("授权").Select("模块 = \'" & nd1.Name & "\'")
        Lst.Clear
        If dr.IsNull("职位")
            If nd1.Checked Then
                dr("职位") = st
            End If
        Else
            Lst.AddRange(dr("职位").split(","))
            If nd1.Checked Then
                If lst.Contains(st) = False Then lst.Add(st)
            Else
                If lst.Contains(st)  Then lst.Remove(st)
            End If
            dr("职位") = String.Join(",",lst.ToArray)
        End If
    Next
Else
    dr = DataTables("授权").Find("模块 = \'" & nd1.ParentNode.Name & "\' And 子模块 = \'" & nd1.Name & "\'")
    If dr IsNot Nothing Then
        Lst.Clear
        If dr.IsNull("职位")
            If nd1.Checked Then
                dr("职位") = st
            End If
        Else
            Lst.AddRange(dr("职位").split(","))
            If nd1.Checked Then
                If lst.Contains(st) = False Then lst.Add(st)
            Else
                If lst.Contains(st)  Then lst.Remove(st)
            End If
            dr("职位") = String.Join(",",lst.ToArray)
        End If
        
    End If
End If

--  作者:weibu
--  发布时间:2018/8/19 11:10:00
--  
太强了“蓝哥”膜拜,我得好好看看
--  作者:weibu
--  发布时间:2018/8/19 11:21:00
--  
这段代码我想实现如果“授权”表里没有登陆者的职位,他登陆后就看不到相应菜单,执行后的结果怎么不对?
如果模块列的值为PDA则不检索

Dim dr2 As DataRow = DataTables("用户信息").find("用户名 = \'" & 用户名 & "\'")  \'找到当前登录者所在的行
For Each dr1 As DataRow In DataTables("授权").DataRows
\'首先判断分组的授权用户是否包括此用户或此用户所属的分组
If dr1.IsNull("职位") = False Andalso dr1("模块")<>"PDA" Then
    Dim nms() As String = dr1("职位").Split(",")
    For Each nm As String In nms
        If nm <> dr2("职位")  Then \'如果授权职位不包含登陆者职位
               If dr1.IsNull("子模块") = False Then
                  RibbonTabs(dr1("模块")).Groups(dr1("分组名")).Items(dr1("子模块")).Visible = False 
               End If
         End If
     Next
 End If
 Next
[此贴子已经被作者于2018/8/19 11:21:50编辑过]

--  作者:有点蓝
--  发布时间:2018/8/19 11:35:00
--  
Dim dr2 As DataRow = DataTables("用户信息").find("用户名 = \'" & 用户名 & "\'")  \'找到当前登录者所在的行
Dim zw As String = "," & dr2("职位") & ","
For Each dr1 As DataRow In DataTables("授权").Select("模块 <> \'PDA\' and 子模块 is not null")
    If ("," & dr1("职位") & ",").contains(zw) = False
        RibbonTabs(dr1("模块")).Groups(dr1("分组名")).Items(dr1("子模块")).Visible = False
    End If
Next