使用递归从数据库读取数据来动态建立菜单

表结构与内容

MenBh MenText Bhparent

0001 文件

0002 编辑

0005 打开 0001

0006 新建 0001

0011 access 数据库 0006

0012 VFP 的 Dbf 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 r 1 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 r 2 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

本新闻共 2 页,当前在第 1 页 1 2

Published At
Categories with Web编程
Tagged with
comments powered by Disqus