推薦:七招制勝ASP.NET應(yīng)用程序開發(fā)隨著微軟.NET的流行,ASP.NET越來越為廣大開發(fā)人員所接受。作為ASP.NET的開發(fā)人員,我們不僅需要掌握其基本的原理,更要多多實踐,從實踐中獲取真正的開發(fā)本領(lǐng)。在我們的實際開發(fā)中,往往基本的
ASP.net2.0 為用戶提供了treeview和menu導(dǎo)航控件,使用十分方便,極大提高了用戶開發(fā)項目的速度和效率。
尤其是treeview和menu綁定web.sitemap之類的XML文件,形成層次數(shù)據(jù)非常便捷。
但我在項目開發(fā)過程中,很多地方是需要綁定關(guān)系數(shù)據(jù)庫,畢竟關(guān)系數(shù)據(jù)庫是最常用、操作最方便的存儲形式。
對于treebview與關(guān)系數(shù)據(jù)庫綁定可以動態(tài)綁定,也就是在page_load事件中首先添加第一級節(jié)點,然后在treeview的SelectedNodeChanged事件中進行判斷添加下一級節(jié)點。因為使用AJAX技術(shù)后,把treeview控件放在UpdatePanel控件之內(nèi),用戶的頁面體驗效果相當不錯。
然而對于menu控件,這樣就有麻煩了,因為我發(fā)現(xiàn)menu在UpdatePanel控件中有問題:就是移動鼠標后原來的菜單項會遺留在屏幕上,直到單擊新的菜單項(不知道是bug,還是我哪里出現(xiàn)問題)。也許有人覺得menu不要動態(tài)綁定,直接綁定XML做成靜態(tài)的多好!但在做項目時需要不同的用戶登陸后出現(xiàn)的菜單效果不同,而在web.sitemap中roles角色控制又不是十分便利,所以使用關(guān)系數(shù)據(jù)庫直接對menu菜單項的enabled進行賦值,控制更加靈活。
因為有bug,只能把menu控件放在UpdatePanel控件之外,對menu的綁定就要在page_load事件中一次性綁定,如果使用menu控件的MenuItemClick事件綁定,那么用戶受不了這樣的體驗!
實現(xiàn)的效果如下:

具體實現(xiàn)代碼如下:
以下為引用的內(nèi)容:
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>導(dǎo)航控件測試</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
1Imports System 2Imports System.Data 3Imports System.Data.SqlClient 4Partial 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
|
數(shù)據(jù)庫結(jié)構(gòu)如下:

上面實現(xiàn)的關(guān)鍵是:
1、addnode遞歸過程,實現(xiàn)下級節(jié)點的添加;
2、DataView的RowFilter屬性,mydv.RowFilter = "parentid=" & pid,篩選出某節(jié)點的下級節(jié)點,進行添加。
以上代碼,沒有優(yōu)化,也不一定是最好的,希望拋磚引玉!
分享:投票結(jié)果的圖片進度條顯示一個投票功能模塊少不了查看投票結(jié)果,用進度條顯示各個投票結(jié)果可以起到一目了然的效果。以下是我的方法,請大家不吝賜教:
1、做一張圖片用于做進度條,只需要很小的一個圖片就可以了,如高2