ASP.NET 2.0的导航控件treeview和menu的实例

 

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 事件绑定,那么用户受不了这样的体验!

改为C#

实现的效果如下:

菜单栏

 

具体实现代码如下:

以下为引用的内容:

default.aspx

 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>
default.aspx.vb


 1   Imports System
 2   Imports System.Data
 3   Imports System.Data.SqlClient
 4   Partial Class Default4Class Default4
 5    Inherits System.Web.UI.Page
 6    Public strConn, strSQL As String
 7    Dim myConn As SqlConnection
 8   Dim mydv As DataView
 9    Dim i As Integer
10    Dim menunode As MenuItem
11    Protected Sub Page_Load()Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
12        strConn = System.Configuration.ConfigurationManager.AppSettings("connstring")
13        myConn = New SqlConnection(strConn)
14     
15        If Not Page.IsPostBack Then
16            strSQL = "select * from menu "
17            mydv = GetDataView(strSQL, "menu")
18            mydv.RowFilter = "parentid=0"
19            For i = 0 To mydv.Count - 1
20                menunode = New MenuItem
21                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            Next
30        End If
31    End Sub
32
33    Sub addnode()Sub addnode(ByVal pnode As MenuItem, ByVal pid As Integer)
34        Dim menunode As MenuItem
35        Dim j As Integer
36        mydv.RowFilter = "parentid=" & pid
37        For j = 0 To mydv.Count - 1
38            menunode = New MenuItem
39            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=" & pid
47        Next
48
49    End Sub
50
51    Function GetDataView()Function GetDataView(ByVal Sql As String, ByVal strTable As String) As DataView
52        Dim myDataAdapter As SqlDataAdapter
53        Dim myDataSet As DataSet
54        myConn.Open()
55        myDataAdapter = New SqlDataAdapter(Sql, myConn)
56        myConn.Close()
57        myDataSet = New DataSet
58        myDataAdapter.Fill(myDataSet, strTable)
59        GetDataView = New DataView(myDataSet.Tables(strTable))
60    End Function

61
62  
63End Class
64

数据库结构如下:

表内容

上面实现的关键是:

1addnode 递归过程,实现下级节点的添加;

2DataView RowFilter 属性,mydv.RowFilter = "parentid=" & pid,筛选出某节点的下级节点,进行添加。

以上代码,没有优化,也不一定是最好的,希望抛砖引玉!

以上是在VB中实现的,下面修改为在C#中实现

default.aspx内容不变,只修改 Language="VB"为“C#”

default.aspx.CS

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;


public partial class Default4 : System.Web.UI.Page

{
            SqlConnection myConn;
            string  strSQL;
            DataView mydv;
            MenuItem menunode;
            string strConn = System.Configuration.ConfigurationManager.ConnectionStrings["syfxConnectionString"].ConnectionString;

    protected void Page_Load(object sender, EventArgs e)
    {
     
       myConn = new SqlConnection(strConn);
       if (!IsPostBack)
        {    strSQL = "select * from menu_xm " ;
             mydv = GetDataView(strSQL,"menu");
             mydv.RowFilter = "parentid=0";
            
          for (int i = 0;i<=(mydv.Count - 1);i++)
            {
              menunode = new MenuItem();
             // menunode.Text = mydv.Item(i).Item("text");
              menunode.Text = mydv[i].Row[2].ToString();
              //menunode.Value = mydv.Item(i).Item("id");
              menunode.Value = mydv[i].Row[0].ToString();
              //menunode.Enabled = mydv.Item(i).Item("Enabled");
              menunode.Enabled = Convert.ToBoolean( mydv[i].Row[5]);
              //menunode.Target = mydv.Item(i).Item("Target");
              menunode.Target = mydv[i].Row[4].ToString();
              //menunode.NavigateUrl = mydv.Item(i).Item("url");
              menunode.NavigateUrl = mydv[i].Row[3].ToString();
              Menu1.Items.Add(menunode);
              addnode(menunode, Int32.Parse(menunode.Value));
              mydv.RowFilter = "parentid=0";
             }
        }

    }

  public void  addnode( MenuItem pnode, int  pid)
    {
        MenuItem menunode;

        mydv.RowFilter = "parentid=" + pid;
        for (int j = 0 ;j<=mydv.Count - 1;j++)
        {
          menunode = new MenuItem();
          // menunode.Text = mydv.Item(i).Item("text");
          menunode.Text = mydv[j].Row[2].ToString();
          //menunode.Value = mydv.Item(i).Item("id");
          menunode.Value = mydv[j].Row[0].ToString();
          //menunode.Enabled = mydv.Item(i).Item("Enabled");
          menunode.Enabled = Convert.ToBoolean( mydv[j].Row[5]);
          //menunode.Target = mydv.Item(i).Item("Target");
          menunode.Target = mydv[j].Row[4].ToString();
          //menunode.NavigateUrl = mydv.Item(i).Item("url");
          menunode.NavigateUrl = mydv[j].Row[3].ToString();


          //menunode.Text = mydv.Item(j).Item("text");
          //menunode.Value = mydv.Item(j).Item("id");
          //menunode.Enabled = mydv.Item(j).Item("Enabled");
          //menunode.Target = mydv.Item(j).Item("Target");
          //menunode.NavigateUrl = mydv.Item(j).Item("url");
          pnode.ChildItems.Add(menunode);
          addnode(menunode, Int32.Parse(menunode.Value)) ;
          mydv.RowFilter = "parentid=" + pid;
          }
    }
 

     public  DataView  GetDataView(string Sql , string strTable)
     {
      
      SqlDataAdapter  myDataAdapter;
      DataSet  myDataSet;
      myConn.Open();
      myDataAdapter = new SqlDataAdapter(Sql, myConn);
      myConn.Close();
      myDataSet = new DataSet();
      myDataAdapter.Fill(myDataSet, strTable);
      DataView  GetDataView = new DataView(myDataSet.Tables[0]);
      return GetDataView;
     }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值