推薦:七招制勝ASP.NET應用程序開發隨著微軟.NET的流行,ASP.NET越來越為廣大開發人員所接受。作為ASP.NET的開發人員,我們不僅需要掌握其基本的原理,更要多多實踐,從實踐中獲取真正的開發本領。在我們的實際開發中,往往基本的
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事件綁定,那么用戶受不了這樣的體驗!
實現的效果如下:
具體實現代碼如下:
以下為引用的內容:
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
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
|
數據庫結構如下:
上面實現的關鍵是:
1、addnode遞歸過程,實現下級節點的添加;
2、DataView的RowFilter屬性,mydv.RowFilter = "parentid=" & pid,篩選出某節點的下級節點,進行添加。
以上代碼,沒有優化,也不一定是最好的,希望拋磚引玉!
分享:投票結果的圖片進度條顯示一個投票功能模塊少不了查看投票結果,用進度條顯示各個投票結果可以起到一目了然的效果。以下是我的方法,請大家不吝賜教:
1、做一張圖片用于做進度條,只需要很小的一個圖片就可以了,如高2