以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]动态生成多级菜单  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=139653)

--  作者:2900819580
--  发布时间: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


--  作者:有点蓝
--  发布时间: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
--  发布时间: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



--  作者:有点蓝
--  发布时间:2019/8/19 14:18:00
--  
Dim mnu As object = args(0)
--  作者:2900819580
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间:2019/8/19 16:33:00
--  
使用枚举值是个办法

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

--  作者:2900819580
--  发布时间: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编辑过]

--  作者:有点蓝
--  发布时间: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