一种使用递归从数据库读取数据来动态建立菜单的方法

表结构与内容

MenBh MenText Bhparent

0001 文件

  1<null>
  2
  30002  编辑  <null>
  4
  50005  打开  0001 
  6
  70006  新建  0001 
  8
  90011  access  数据库  0006 
 10
 110012  VFP  的  Dbf  0006 
 12
 130013  剪切  0002 
 14
 150014  复制  0002 
 16
 170015  完全复制  0014 
 18
 19Private  m  As  New  MainMenu() 
 20
 21Private  Sub  Form1_Load(  ByVal  sender  As  System.Object,  ByVal  e  As  System.EventArgs)  Handles  MyBase  .Load 
 22
 23Dim  conn  As  New  SqlConnection("server=localhost;uid=sa;pwd=;database=jiang") 
 24
 25Dim  cmd  As  New  SqlCommand("select * from a_menu ", conn) 
 26
 27Dim  ds  As  New  DataSet() 
 28
 29Dim  sqldpr  As  New  SqlDataAdapter(cmd) 
 30
 31sqldpr.Fill(ds, "menu") 
 32
 33Me  .DataGrid1.DataSource = ds.Tables("menu") 
 34
 35'  创建关系 
 36
 37Dim  dr  As  New  DataRelation("self_menu", ds.Tables("menu").Columns("MenBh"), ds.Tables("menu").Columns("Bhparent")) 
 38
 39ds.Relations.Add(dr) 
 40
 41Dim  r1  As  DataRow 
 42
 43'  查找最高的菜单级别  ,  也就是  Bhparent  列为空的行 
 44
 45For  Each  r  1  In  ds.Tables("menu").Rows 
 46
 47If  r1.IsNull("Bhparent")  Then 
 48
 49addmenuitem(r1,  Nothing  ) 
 50
 51End  If 
 52
 53Next 
 54
 55Me  .Menu = m  '  指定主窗体菜单 
 56
 57End  Sub 
 58
 59'  递归函数 
 60
 61Private  Sub  addmenuitem(  ByVal  r  As  DataRow,  ByVal  item  As  MenuItem) 
 62
 63Dim  mi  As  MenuItem 
 64
 65'  如果是最外层菜单,要直接添加 
 66
 67If  item  Is  Nothing  Then 
 68
 69mi = m.MenuItems.Add(r.Item("MenText")) 
 70
 71Else  '  如果是下级菜单要在菜单项的上级添加 
 72
 73mi = item.MenuItems.Add(r.Item("MenText")) 
 74
 75End  If 
 76
 77Dim  r2  As  DataRow 
 78
 79For  Each  r  2  In  r.GetChildRows("self_menu") 
 80
 81addmenuitem(r2, mi) 
 82
 83Next 
 84
 85End  Sub 
 86
 87'--------------------------------------------------------一种方法的改进 
 88
 89‘  /////////////////////////////////////////////////////////////////////////////////////////////// 
 90
 91‘  继承自  menuitem  的类 
 92
 93‘  /////////////////////////////////////////////////////////////////////////////////////////////// 
 94
 95Public  Class  mymenuitem 
 96
 97Inherits  System.Windows.Forms.MenuItem 
 98
 99Public  Sub  New  (  ByVal  s  As  String  ,  ByVal  tag  As  String  ) 
100
101MyBase  .New() 
102
103Me  .Text = s 
104
105m_tag = tag 
106
107End  Sub 
108
109Private  m_tag  As  String 
110
111Public  Property  tag()  As  String 
112
113Get 
114
115Return  m_tag 
116
117End  Get 
118
119Set  (  ByVal  Value  As  String  ) 
120
121m_tag = Value 
122
123End  Set 
124
125End  Property 
126
127End class 
128
129‘  /////////////////////////////////////////////////////////////////////////////////////////////// 
130
131‘  在代码中实现这种菜单项的添加和菜单的建立 
132
133‘  ////////////////////////////////////////////////////////////////////////////////////////////// 
134
135Private  m  As  New  MainMenu() 
136
137Private  Sub  Form1_Load(  ByVal  sender  As  System.Object,  ByVal  e  As  System.EventArgs)  Handles  MyBase  .Load 
138
139Dim  conn  As  New  SqlConnection("server=localhost;uid=sa;pwd=;database=jiang") 
140
141Dim  cmd  As  New  SqlCommand("select * from a_menu ", conn) 
142
143Dim  ds  As  New  DataSet() 
144
145Dim  sqldpr  As  New  SqlDataAdapter(cmd) 
146
147sqldpr.Fill(ds, "menu") 
148
149'Me.DataGrid1.DataSource = ds.Tables("menu") 
150
151Me  .DataGrid1.DataSource = ds 
152
153Me  .DataGrid1.DataMember = "menu" 
154
155'  创建关系 
156
157Dim  dr  As  New  DataRelation("self_menu", ds.Tables("menu").Columns("MenBh"), ds.Tables("menu").Columns("Bhparent")) 
158
159ds.Relations.Add(dr) 
160
161Dim  r1  As  DataRow 
162
163'  查找最高的菜单级别  ,  也就是  Bhparent  列为空的行 
164
165For  Each  r  1  In  ds.Tables("menu").Rows 
166
167If  r1.IsNull("Bhparent")  Then 
168
169addmenuitem(r1,  Nothing  ) 
170
171End  If 
172
173Next 
174
175Me  .Menu = m  '  指定主窗体菜单 
176
177End  Sub 
178
179'  递归函数 
180
181Private  Sub  addmenuitem(  ByVal  r  As  DataRow,  ByVal  item  As  MenuItem) 
182
183Dim  mi  As  MenuItem 
184
185'  如果是最外层菜单,要直接添加 
186
187If  item  Is  Nothing  Then 
188
189Try 
190
191mi =  New  mymenuitem(r.Item("MenText"), "1") 
192
193m.MenuItems.Add(mi) 
194
195Catch  ex  As  Exception 
196
197MessageBox.Show(ex.ToString) 
198
199End  Try 
200
201Else  '  如果是下级菜单要在菜单项的上级添加 
202
203mi =  New  mymenuitem(r.Item("MenText"), "2") 
204
205item.MenuItems.Add(mi) 
206
207End  If 
208
209Dim  r2  As  DataRow 
210
211For  Each  r  2  In  r.GetChildRows("self_menu") 
212
213addmenuitem(r2, mi) 
214
215Next 
216
217End  Sub</null></null>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus