zoukankan      html  css  js  c++  java
  • 使用递归从数据库读取数据来动态建立菜单

    表结构与内容

    MenBh            MenText     Bhparent

    0001             文件         

    0002             编辑         

    0005             打开          0001

    0006             新建          0001

    0011             access数据库  0006

    0012             VFPDbf      0006

    0013             剪切          0002

    0014             复制          0002

    0015            完全复制       0014

        

    Private m As New MainMenu()

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Dim conn As New SqlConnection("server=localhost;uid=sa;pwd=;database=jiang")

            Dim cmd As New SqlCommand("select * from a_menu ", conn)

            Dim ds As New DataSet()

            Dim sqldpr As New SqlDataAdapter(cmd)

            sqldpr.Fill(ds, "menu")

            Me.DataGrid1.DataSource = ds.Tables("menu")

            '创建关系

            Dim dr As New DataRelation("self_menu", ds.Tables("menu").Columns("MenBh"), ds.Tables("menu").Columns("Bhparent"))

            ds.Relations.Add(dr)

            Dim r1 As DataRow

            '查找最高的菜单级别,也就是Bhparent列为空的行

            For Each r1 In ds.Tables("menu").Rows

                If r1.IsNull("Bhparent") Then

                    addmenuitem(r1, Nothing)

                End If

            Next

            Me.Menu = m '指定主窗体菜单

        End Sub

        '递归函数

        Private Sub addmenuitem(ByVal r As DataRow, ByVal item As MenuItem)

            Dim mi As MenuItem

            '如果是最外层菜单,要直接添加

            If item Is Nothing Then

                mi = m.MenuItems.Add(r.Item("MenText"))

            Else '如果是下级菜单要在菜单项的上级添加

                mi = item.MenuItems.Add(r.Item("MenText"))

            End If

            Dim r2 As DataRow

            For Each r2 In r.GetChildRows("self_menu")

                addmenuitem(r2, mi)

            Next

        End Sub

    '--------------------------------------------------------一种方法的改进

    /////////////////////////////////////////////////////////////////////////////////////

    继承自menuitem的类

    /////////////////////////////////////////////////////////////////////////////////////

    Public Class mymenuitem

    Inherits System.Windows.Forms.MenuItem

     

    Public Sub New(ByVal s As String, ByVal tag As String)

            MyBase.New()

            Me.Text = s

            m_tag = tag

        End Sub

        Private m_tag As String

        Public Property tag() As String

            Get

                Return m_tag

            End Get

            Set(ByVal Value As String)

                m_tag = Value

            End Set

    End Property

      End class



    ////////////////////////////////////////////////////////////////////////////////////

    在代码中实现这种菜单项的添加和菜单的建立

    //////////////////////////////////////////////////////////////////////////////////

    Private m As New MainMenu()

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            Dim conn As New SqlConnection("server=localhost;uid=sa;pwd=;database=jiang")

            Dim cmd As New SqlCommand("select * from a_menu ", conn)

            Dim ds As New DataSet()

            Dim sqldpr As New SqlDataAdapter(cmd)

            sqldpr.Fill(ds, "menu")

     

     

            'Me.DataGrid1.DataSource = ds.Tables("menu")

            Me.DataGrid1.DataSource = ds

            Me.DataGrid1.DataMember = "menu"

            '创建关系

            Dim dr As New DataRelation("self_menu", ds.Tables("menu").Columns("MenBh"), ds.Tables("menu").Columns("Bhparent"))

            ds.Relations.Add(dr)

            Dim r1 As DataRow

     

            '查找最高的菜单级别,也就是Bhparent列为空的行

            For Each r1 In ds.Tables("menu").Rows

                If r1.IsNull("Bhparent") Then

                    addmenuitem(r1, Nothing)

                End If

            Next

            Me.Menu = m '指定主窗体菜单

        End Sub

        '递归函数

        Private Sub addmenuitem(ByVal r As DataRow, ByVal item As MenuItem)

            Dim mi As MenuItem

     

            '如果是最外层菜单,要直接添加

            If item Is Nothing Then

                Try

                    mi = New mymenuitem(r.Item("MenText"), "1")

                    m.MenuItems.Add(mi)

                Catch ex As Exception

                    MessageBox.Show(ex.ToString)

                End Try

            Else '如果是下级菜单要在菜单项的上级添加

                mi = New mymenuitem(r.Item("MenText"), "2")

                item.MenuItems.Add(mi)

            End If

            Dim r2 As DataRow

            For Each r2 In r.GetChildRows("self_menu")

                addmenuitem(r2, mi)

            Next

        End Sub

  • 相关阅读:
    ShoneSharp语言(S#)的设计和使用介绍系列(10)— 富家子弟“语句“不炫富
    ShoneSharp语言(S#)的设计和使用介绍系列(9)— 一等公民“函数“爱炫巧
    ShoneSharp语言(S#)的设计和使用介绍系列(8)— 最炫“公式”风
    ShoneSharp语言(S#)的设计和使用介绍系列(1)— 开篇
    ShoneSharp语言(S#)软件更新13.7版
    ShoneSharp语言(S#)软件更新13.6版
    ShoneSharp语言(S#)的设计和使用介绍系列(7)— 布尔Bool及对象Object
    ShoneSharp语言(S#)的设计和使用介绍系列(6)— 字符串String
    自然语言处理系列-4条件随机场(CRF)及其tensorflow实现
    【NLP】老司机带你入门自然语言处理
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/791678.html
Copyright © 2011-2022 走看看