asp.net2.0的导航控件treeview和menu
http://www.cnblogs.com/njypcmqj/archive/2007/06/09/777581.html
ASP.net2.0 为用户提供了treeview和menu导航控件,使用十分方便,极大提高了用户开发项目的速度和效率。
尤其是treeview和menu绑定web.sitemap之类的XML文件,形成层次数据非常便捷。
但我在项目开发过程中,很多地方是需要绑定关系数据库,毕竟关系数据库是最常用、操作最方便的存储形式。
对于treebview与关系数据库绑定可以动态绑定,也就是在page_load事件中首先添加第一级节点,然后在treeview的SelectedNodeChanged事件中进行判断添加下一级节点。因为使用AJAX技术后,把treeview控件放在UpdatePanel控件之内,用户的页面体验效果相当不错。
然而对于menu控件,这样就有麻烦了,因为我发现menu在UpdatePanel控件中有问题:就是移动鼠标后原来的菜单项会遗留在屏幕上,直到单击新的菜单项(不知道是bug,还是我哪里出现问题)。也许有人觉得menu不要动态绑定,直接绑定XML做成静态的多好!但在做项目时需要不同的用户登陆后出现的菜单效果不同,而在web.sitemap中roles角色控制又不是十分便利,所以使用关系数据库直接对menu菜单项的enabled进行赋值,控制更加灵活。
因为有bug,只能把menu控件放在UpdatePanel控件之外,对menu的绑定就要在page_load事件中一次性绑定,如果使用menu控件的MenuItemClick事件绑定,那么用户受不了这样的体验!
实现的效果如下:
具体实现代码如下:
1
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default4.aspx.vb" Inherits="Default4" %>2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">3
<html xmlns="http://www.w3.org/1999/xhtml" >4
<head runat="server">5
<title>导航控件测试</title>6
</head>7
<body>8
<form id="form1" runat="server">9

10
11
<asp:Menu ID="Menu1" 12
runat="server" 13
disappearafter="2000"14
staticsubmenuindent="10px" 15
orientation="Horizontal"16
StaticEnableDefaultPopOutImage="False"17
BackColor="#E3EAEB" 18
DynamicHorizontalOffset="2" 19
Font-Names="宋体" 20
Font-Size="14px" 21
ForeColor="#666666" >22
<StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />23
<DynamicHoverStyle BackColor="#666666" ForeColor="White" />24
<DynamicMenuStyle BackColor="#E3EAEB" />25
<StaticSelectedStyle BackColor="#E3EAEB" />26
<DynamicSelectedStyle BackColor="#E3EAEB" />27
<DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />28
<StaticHoverStyle BackColor="#666666" ForeColor="White" />29
</asp:Menu>30
31
</form>32
</body>33
</html>
2
Imports System.Data3
Imports System.Data.SqlClient4
Partial Class Default45
Inherits System.Web.UI.Page6
Public strConn, strSQL As String7
Dim myConn As SqlConnection8
Dim mydv As DataView9
Dim i As Integer10
Dim menunode As MenuItem11
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load12
strConn = System.Configuration.ConfigurationManager.AppSettings("connstring")13
myConn = New SqlConnection(strConn)14
15
If Not Page.IsPostBack Then16
strSQL = "select * from menu "17
mydv = GetDataView(strSQL, "menu")18
mydv.RowFilter = "parentid=0"19
For i = 0 To mydv.Count - 120
menunode = New MenuItem21
menunode.Text = mydv.Item(i).Item("text")22
menunode.Value = mydv.Item(i).Item("id")23
menunode.Enabled = mydv.Item(i).Item("Enabled")24
menunode.Target = mydv.Item(i).Item("Target")25
menunode.NavigateUrl = mydv.Item(i).Item("url")26
Menu1.Items.Add(menunode)27
addnode(menunode, menunode.Value)28
mydv.RowFilter = "parentid=0"29
Next30
End If31
End Sub32

33
Sub addnode(ByVal pnode As MenuItem, ByVal pid As Integer)34
Dim menunode As MenuItem35
Dim j As Integer36
mydv.RowFilter = "parentid=" & pid37
For j = 0 To mydv.Count - 138
menunode = New MenuItem39
menunode.Text = mydv.Item(j).Item("text")40
menunode.Value = mydv.Item(j).Item("id")41
menunode.Enabled = mydv.Item(j).Item("Enabled")42
menunode.Target = mydv.Item(j).Item("Target")43
menunode.NavigateUrl = mydv.Item(j).Item("url")44
pnode.ChildItems.Add(menunode)45
addnode(menunode, menunode.Value)46
mydv.RowFilter = "parentid=" & pid47
Next48

49
End Sub50

51
Function GetDataView(ByVal Sql As String, ByVal strTable As String) As DataView52
Dim myDataAdapter As SqlDataAdapter53
Dim myDataSet As DataSet54
myConn.Open()55
myDataAdapter = New SqlDataAdapter(Sql, myConn)56
myConn.Close()57
myDataSet = New DataSet58
myDataAdapter.Fill(myDataSet, strTable)59
GetDataView = New DataView(myDataSet.Tables(strTable))60
End Function61

62
63
End Class
数据库结构如下:
上面实现的关键是:
1、addnode递归过程,实现下级节点的添加;
2、DataView的RowFilter属性,mydv.RowFilter = "parentid=" & pid,筛选出某节点的下级节点,进行添加。

浙公网安备 33010602011771号