Foxtable(狐表)用户栏目专家坐堂 → 麻烦的菜单遍历


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

主题:麻烦的菜单遍历

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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
麻烦的菜单遍历  发帖心情 Post By:2014/6/7 11:03:00 [显示全部帖子]

窗口、控件、表、列、目录树节点、下拉列表、系统目录文件、Ftp目录文件,他们的遍历相对比较简单。

要么层级少,要么类型少。

 

菜单就不一样了,层级多、类型多。

首先要区分功能区菜单、快速访问栏、配置栏、程序菜单、快捷菜单。

接下来,功能区还要分功能组,功能组再分菜单项,菜单项再分各种类型,有的下层套下层,有的没下层。

其他类型的,也是一层套一层。

 

对于不知道层级的菜单,要遍历,何其难也,遍历多少层呢?不知道,只能多不能少。

 

编辑器里面,既然列出了菜单、窗口、字段、函数,等等,说明是有办法的。


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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/6/7 11:10:00 [显示全部帖子]

Ftp目录和文件的递归,我已经写好了,很好用。

但菜单的递归,要麻烦多了,谁有高效的递归函数,让俺也乐呵乐呵。


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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/6/7 11:19:00 [显示全部帖子]

以下是引用Bin在2014-6-7 11:14:00的发言:
看3楼, 之前我写过一个例子,用的是比较笨的方法.  需要判断指定的几个有可能出现下拉子选项的类型.

谢谢,刚才找到,看了,还是有局限。


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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/6/7 12:03:00 [显示全部帖子]

难就难在,菜单的命名,是层层嵌套的。

不然的话,用

Do While ....

 

Loop

就行了。

 

如果有类似目录树的FullName属性,也行。

[此贴子已经被作者于2014-6-7 12:04:00编辑过]

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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/6/7 13:43:00 [显示全部帖子]

以下是引用blackzhu在2014-6-7 12:37:00的发言:
lsy  倒过来 根据表生成菜单 不就OK了.  我现在的做法就是用表控制菜单或者导航  以及控制窗口按钮编辑
[此贴子已经被作者于2014-6-7 12:39:40编辑过]

谢谢提示。

我觉得狐表的菜单,非常棒,舍不得丢了,直接导进来用,

只需要根据权限,隐藏或停用即可。

省很多事。


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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/6/7 15:54:00 [显示全部帖子]

以下是引用逛逛在2014-6-7 14:50:00的发言:

 

 试试

 


以下内容只有回复后才可以浏览

 

 下载信息  [文件大小:348.0 KB  下载次数:4]
图片点击可在新窗口打开查看点击浏览该文件:菜单递归.table

 


先衷心感谢,再潜心学习。


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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/6/7 16:00:00 [显示全部帖子]

借道XML文件,总算实现功能了。

可见这个菜单遍历,还是不容易。


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


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2014/6/7 16:08:00 [显示全部帖子]

用笨办法,做菜单目录树,属于“盲打”,又不知道总共有多少层级。

下面这一小段,改一下层级,只管往下续,比实际层级多了,也不会出错,所谓“油多不坏菜”。

If lst.Contains(itm2.Gettype.Name) Then
      For Each itm3 As RibbonMenu.RibbonItem In RibbonTabs(rtb.Name)(grp.Name)(itm.Name)(itm1.Name)(itm2.Name).Items
            If tv.Nodes(rtb.Name).Nodes(grp.Name).Nodes(itm.Name).Nodes(itm1.Name).Nodes(itm2.Name).Nodes.Contains(itm3.Name) = False Then
                  tv.Nodes(rtb.Name).Nodes(grp.Name).Nodes(itm.Name).Nodes(itm1.Name).Nodes(itm2.Name).Nodes.Add(itm3.Name)
            End If                                    
      Next
End If

 

这下面是完整代码:

Dim tv As WinForm.TreeView = e.Form.Controls("TreeView1")
tv.Nodes.Clear
For Each rtb As RibbonMenu.Tab In RibbonTabs
    If tv.Nodes.Contains(rtb.Name) = False
        tv.Nodes.Add(rtb.Name)
    End If
    For Each grp As RibbonMenu.Group In rtb.Groups
        If tv.Nodes(rtb.Name).Nodes.Contains(grp.Name) = False Then
            tv.Nodes(rtb.Name).Nodes.Add(grp.Name)
        End If
        For Each itm As RibbonMenu.RibbonItem In grp.Items
            If tv.Nodes(rtb.Name).Nodes(grp.Name).Nodes.Contains(itm.Name) = False Then
                tv.Nodes(rtb.Name).Nodes(grp.Name).Nodes.Add(itm.Name)
            End If
            Dim str As String = "ComboBox,SplitButton,ToggleGroup,ToolBar,FontComboBox,MenuButton"
            Dim lst As New List(Of String)
            lst.AddRange(str.Split(","))
            If lst.Contains(itm.Gettype.Name) Then
                For Each itm1 As RibbonMenu.RibbonItem In RibbonTabs(rtb.Name)(grp.Name)(itm.Name).Items
                    If tv.Nodes(rtb.Name).Nodes(grp.Name).Nodes(itm.Name).Nodes.Contains(itm1.Name) = False Then
                        tv.Nodes(rtb.Name).Nodes(grp.Name).Nodes(itm.Name).Nodes.Add(itm1.Name)
                    End If
                    If lst.Contains(itm1.Gettype.Name) Then
                        For Each itm2 As RibbonMenu.RibbonItem In RibbonTabs(rtb.Name)(grp.Name)(itm.Name)(itm1.Name).Items
                            If tv.Nodes(rtb.Name).Nodes(grp.Name).Nodes(itm.Name).Nodes(itm1.Name).Nodes.Contains(itm2.Name) = False Then
                                tv.Nodes(rtb.Name).Nodes(grp.Name).Nodes(itm.Name).Nodes(itm1.Name).Nodes.Add(itm2.Name)
                            End If
                            If lst.Contains(itm2.Gettype.Name) Then
                                For Each itm3 As RibbonMenu.RibbonItem In RibbonTabs(rtb.Name)(grp.Name)(itm.Name)(itm1.Name)(itm2.Name).Items
                                    If tv.Nodes(rtb.Name).Nodes(grp.Name).Nodes(itm.Name).Nodes(itm1.Name).Nodes(itm2.Name).Nodes.Contains(itm3.Name) = False Then
                                        tv.Nodes(rtb.Name).Nodes(grp.Name).Nodes(itm.Name).Nodes(itm1.Name).Nodes(itm2.Name).Nodes.Add(itm3.Name)
                                    End If                                   
                                Next
                            End If
                        Next
                    End If
                Next
            End If
        Next
    Next
Next


 回到顶部