表结构与内容
MenBh MenText Bhparent
0001 文件 <null>
0002 编辑 <null>
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 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