Foxtable(狐表)用户栏目专家坐堂 → [求助]动态生成多级菜单


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

主题:[求助]动态生成多级菜单

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


加好友 发短信
等级:六尾狐 帖子:1302 积分:9451 威望:0 精华:0 注册:2015/6/30 8:46:00
[求助]动态生成多级菜单  发帖心情 Post By:2019/8/18 15:52:00 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:mic27-ma.png
图片点击可在新窗口打开查看
窗体代码

cmd.CommandText = "sele ct * from {菜单管理表} where 窗体名称 = '" & e.Form.Name & "'"
Dim csdt As DataTable = cmd.ExecuteReader
For Each cr As DataRow In csdt.DataRows
    If cr.IsNull("名称") = False Then
        If cr("层数") = 1 Then
            Dim mnu As Winform.Strip
            mnu = e.Form.Strips.Add(cr("名称"),cr("菜单ID"))
            Dim drs As List(of DataRow) = csdt.Select("父阶id =" & cr("ID"))
            If drs.Count > 0 Then
                Functions.Execute("增加菜单",mnu,csdt,cr("ID"),cr("层数"))
            End If
        End If
    End If
Next

 

递归代码.............问题在这里,不会调试了,请老师指点

Dim mnu As Winform.Strip
Dim itm As WinForm.StripItem
Dim csdt As DataTable = args(1)
If args(3) > 1 Then
    itm = args(0)
Else
    mnu = args(0)
End If
Dim drs As List(of DataRow) = csdt.Select("父阶id =" & args(2))
If drs IsNot Nothing Then
    For Each dr As DataRow In drs
        Dim drs1 As List(of DataRow) = csdt.Select("父阶id =" & dr("ID"))
        If drs1.Count > 0 Then
            If dr("层数") > 2 Then
                Functions.Execute("增加菜单",itm,csdt,dr("id"),dr("层数"))
            Else
                Functions.Execute("增加菜单",mnu,csdt,dr("id"),dr("层数"))
            End If
        Else
            If dr("层数") > 2 Then
                itm.Items.Add(dr("名称"),dr("标题"),dr("图标") ,dr("菜单ID"))
            Else
                mnu.Items.Add(dr("名称"),dr("标题"),dr("图标") ,dr("菜单ID"))
            End If
        End If
    Next
End If


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


加好友 发短信
等级:超级版主 帖子:105495 积分:536466 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/18 20:57:00 [只看该作者]

cmd.CommandText = "sele ct * from {菜单管理表} where 窗体名称 = '" & e.Form.Name & "' and 名称 is not null"
Dim csdt As DataTable = cmd.ExecuteReader
For Each cr As DataRow In csdt.Select("层数=1")
    Dim mnu As Winform.Strip
    If cr("菜单类型") = "MainMenu"
        mnu = e.Form.Strips.Add(cr("名称"),StripTypeEnum.MainMenu)
    ElseIf cr("菜单类型") = "ContextMenu"
        ......
    End If
    If mnu IsNot Nothing
        Functions.Execute("增加菜单",mnu,csdt,cr("ID"))
    End If
Next

函数

Dim mnu As Winform.Strip = args(0)
Dim csdt As DataTable = args(1)
Dim id As Integer = args(2)

For Each cr As DataRow In csdt.Select("父阶id=" & id)
    Dim itm As WinForm.StripItem
    If cr("菜单类型") = "MenuItem"
        mnu.Items.Add(dr("名称"),dr("标题"),dr("图标") ,StripItemTypeEnum.MenuItem)
    ElseIf cr("菜单类型") = "Button"
        ……
    End If
    itm = mnu.Items(dr("名称"))
    Functions.Execute("增加菜单",itm ,csdt,cr("ID"))
Next

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


加好友 发短信
等级:六尾狐 帖子:1302 积分:9451 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/8/19 13:56:00 [只看该作者]

.NET Framework 版本:2.0.50727.5485
Foxtable 版本:2018.3.9.1
错误所在事件:自定义函数增加菜单
详细错误信息:
调用的目标发生了异常。
无法将类型为“Foxtable.WinForm.StripItem”的对象强制转换为类型“Foxtable.WinForm.Strip”。

 

老师,

递归的时候,args(0) 的类型变为了WinForm.StripItem 而不是你声明的Winform.Strip



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


加好友 发短信
等级:超级版主 帖子:105495 积分:536466 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/19 14:18:00 [只看该作者]

Dim mnu As object = args(0)

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


加好友 发短信
等级:六尾狐 帖子:1302 积分:9451 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/8/19 15:21:00 [只看该作者]

老师,问题已经解决了,但是代码比较多,StripItemTypeEnum.MenuItem 这些类型好像都有对应的ID的,怎么样可以查到这些对应表,这样代码就可以简化很多了。

mnu.Items.Add(dr("名称"),dr("标题"),dr("图标") ,dr("菜单ID"))  ‘下面红色的代码只用这一句就可以了

 

 

Dim mnu As object = args(0)
Dim csdt As DataTable = args(1)
Dim id As Integer = args(2)

For Each dr As DataRow In csdt.Select("父阶id =" & id)

    Dim itm As WinForm.StripItem
    Select Case dr("菜单类型")
        Case "MenuItem"
            mnu.Items.Add(dr("名称"),dr("标题"),dr("图标") ,StripItemTypeEnum.MenuItem)
        Case "Button"
            mnu.Items.Add(dr("名称"),dr("标题"),dr("图标") ,StripItemTypeEnum.Button)
        Case "Label"
            mnu.Items.Add(dr("名称"),dr("标题"),dr("图标") ,StripItemTypeEnum.Label)
        Case "SplitButton"
            mnu.Items.Add(dr("名称"),dr("标题"),dr("图标") ,StripItemTypeEnum.SplitButton)
        Case "Separator"
            mnu.Items.Add(dr("名称"),dr("标题"),dr("图标") ,StripItemTypeEnum.Separator)
    End Select


    itm = mnu.Items(dr("名称"))
    Functions.Execute("增加菜单",itm ,csdt,dr("ID"))
Next

[此贴子已经被作者于2019/8/19 15:21:39编辑过]

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


加好友 发短信
等级:超级版主 帖子:105495 积分:536466 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/19 16:33:00 [只看该作者]

使用枚举值是个办法

For Each item As StripItemTypeEnum In [Enum].GetValues(Gettype(StripItemTypeEnum))
    Output.Show(item & "-" & item.Tostring())
Next

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


加好友 发短信
等级:六尾狐 帖子:1302 积分:9451 威望:0 精华:0 注册:2015/6/30 8:46:00
  发帖心情 Post By:2019/8/20 19:17:00 [只看该作者]

0-MenuItem

枚举出来 MenuItem 的值是0,但是用它就没办法生成次级菜单,不知为何???

Dim cmd As new SQLCommand
cmd.C
'~~~~~~~~~~~~设置菜单~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

cmd.CommandText = "se lect * from {菜单管理表} where 窗体名称 = '" & e.Form.Name & "'"
Dim csdt As DataTable = cmd.ExecuteReader
For Each cr As DataRow In csdt.Select("层数=1")
    Dim mnu As Winform.Strip
    mnu = e.Form.Strips.Add(cr("名称"),cr("菜单ID"))
    If mnu IsNot Nothing Then Functions.Execute("增加菜单id",mnu,csdt,cr("ID"))
Next

 

函数

Dim mnu As object = args(0)
Dim csdt As DataTable = args(1)
Dim id As Integer = args(2)

For Each dr As DataRow In csdt.Select("父阶id =" & id)
    Dim itm As WinForm.StripItem
    itm = mnu.Items(dr("名称"))
    mnu.Items.Add(dr("名称"),dr("标题"),dr("图标") ,dr("菜单ID"))
Next

 


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

 

[此贴子已经被作者于2019/8/20 19:17:08编辑过]

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


加好友 发短信
等级:超级版主 帖子:105495 积分:536466 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/20 20:38:00 [只看该作者]

都没有递归,当然无法生成

函数

Dim mnu As object = args(0)
Dim csdt As DataTable = args(1)
Dim id As Integer = args(2)

For Each dr As DataRow In csdt.Select("父阶id =" & id)
    mnu.Items.Add(dr("名称"),dr("标题"),dr("图标") ,dr("菜单ID")) 

Functions.Execute("增加菜单id",mnu.Items(dr("名称")),csdt,dr("ID"))

Next


 回到顶部