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

具體實(shí)現(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)航控件測(cè)試</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ù)庫(kù)結(jié)構(gòu)如下:

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