利用TreeView與XML建構多層次選單

  TreeView是一個很方便建構選擇系統的控制項,除非你的選單不大也不複雜,TreeView預設的使用方法,可以讓你很快速建構起一個選單。但如果要有進階一點的效果,那就要從程式碼下手。我們先在Default.aspx拉一個TreeView控制項,然後請在相同目錄下新增一個xmlMenu.txt檔案,內容如下:


<選單>
<功能選單>
<資料管理>
<新增資料>
<銷貨>AddData1.aspx</銷貨>
<庫存>AddData2.aspx</庫存>
<客戶>AddData3.aspx</客戶>
</新增資料>
<修改資料>
</修改資料>
<刪除資料>
</刪除資料>
</資料管理>
</功能選單>
<維護選單>
<系統維護>
<備份資料>
</備份資料>
<還原資料>
</還原資料>
<驗證資料>
</驗證資料>
</系統維護>
</維護選單>
<相關網站>
<Yahoo>http://tw.yahoo.com</Yahoo>
<Google>http://www.google.com.tw</Google>
<金剛.Bruce>http://kkbruce.blogspot.com/</金剛.Bruce>
</相關網站>
</選單>

  這個檔案的使用,我等一下再說明。

  打開Default.aspx.vb,先匯入

Imports System.IO
Imports System.Xml


  然後在Page_Load事件,寫下以下程式碼:


'建立XML格式的選單用
Dim XMLmenu As String = ""
Dim file As File
Dim path As String

     '如果xmlMenu.txt讀取失敗,出現預設的選單
XMLmenu += "<選單>"
XMLmenu += "<功能選單>"
XMLmenu += " <資料管理>"
XMLmenu += " <新增資料>"
XMLmenu += " </新增資料>"
XMLmenu += " <修改資料>"
XMLmenu += " </修改資料>"
XMLmenu += " <刪除資料>"
XMLmenu += " </刪除資料>"
XMLmenu += " </資料管理>"
XMLmenu += "</功能選單>"
XMLmenu += "<維護選單>"
XMLmenu += " <系統維護>"
XMLmenu += " <備份資料>"
XMLmenu += " </備份資料>"
XMLmenu += " <還原資料>"
XMLmenu += " </還原資料>"
XMLmenu += " <驗證資料>"
XMLmenu += " </驗證資料>"
XMLmenu += " </系統維護>"
XMLmenu += "</維護選單>"
XMLmenu += "</選單>"

     '設定xmlMenu.txt路徑
path = Request.PhysicalApplicationPath & "xmlMenu.txt"
'xmlMenu.txt檔案存在,從檔案讀取XML
If file.Exists(path) Then
Dim fileStream As FileStream = file.OpenRead(path)
Dim StreamReader As New StreamReader(fileStream, System.Text.Encoding.Default)
       '將xmlMenu.txt內容讀入XMLmenu變數中
XMLmenu = StreamReader.ReadToEnd
fileStream.Close()
StreamReader.Close()
End If

'建立選單
Call BuildTreeView(XMLmenu)


  這裡我們做幾件事,一是預設一組XML,以防xmlMenu.txt讀取有問題時,也能正常顯示選單。二是取得xmlMenu.txt檔案路徑,然後判斷路徑的檔案是否存在,是的話就讀取,不存在的話,就使用預設XMLmenu變數內容。最後將XMLmenu變數傳入Function BuildTreeView。


  '利用XML建立 TreeView 選單
Function BuildTreeView(ByVal XMLmenu As String) As TreeNode
'xml選單資料
Dim xmlPaser As New XmlDocument()
'Base XmlNode
Dim Node As XmlNode
Dim i As Integer

'取得XML選單
xmlPaser.LoadXml(XMLmenu)

     '從<選單>開始
Node = xmlPaser.SelectSingleNode("選單")
For i = 0 To Node.ChildNodes.Count - 1
       '先呼叫第二個Function MakeChildNodes
'將主Node加入TreeView
Me.TreeView1.Nodes.Add(MakeChildNodes(Node.ChildNodes(i)))
Next
End Function


  BuildTreeView做的事很簡單,一是透過xmlPaser.LoadXML(XMLmenu)幫我們把XMLMenu變數內容讀取出來,然後將讀取出來的內容整理成正真的XML格式資料;二是透過xmlPaser.SelectSingleNode("選單")指定那裡是「根」,然後一層一層往下讀,再將Node.ChildNodes(i)透過MakeChildNodes函數將Xml Node轉成 TreeView Node。最後將資料加入TreeView1.Nodes中即可。


  '將 Xml Node轉成 TreeView Node
Function MakeChildNodes(ByVal XmlNode As XmlNode) As TreeNode
Dim Node As New TreeNode()
Dim i As Integer

Node.Text = XmlNode.Name
'當只有一個子節點時(可能是網址)
If XmlNode.ChildNodes.Count = 1 Then
'目前XmlNode的型別是否等於XmlNodeType.Text(文字內容)
If XmlNode.ChildNodes(0).NodeType = XmlNodeType.Text Then
'網址,取得節點文字當作URL
Node.NavigateUrl = XmlNode.InnerText
End If
End If
'往下跑每一個節點
'若子節點是文字模式,則不跑,因為是URL
For i = 0 To XmlNode.ChildNodes.Count - 1
If XmlNode.ChildNodes(i).NodeType <> XmlNodeType.Text Then
Node.ChildNodes.Add(MakeChildNodes(XmlNode.ChildNodes(i)))
End If
Next
     '傳回TreeView Node
MakeChildNodes = Node
End Function


  這樣你就可以透過xmlMenu.txt檔案來管理你的選單。你可以先測試把xmlMenu.txt修改成其他檔名,那畫面就會跑出預設XMLmenu的內容。

  這支程式還有其他進步的地方,例如我們讀取xmlMenu.txt的這一段:


     '設定xmlMenu.txt路徑
path = Request.PhysicalApplicationPath & "xmlMenu.txt"
'xmlMenu.txt檔案存在,從檔案讀取XML
If file.Exists(path) Then
Dim fileStream As FileStream = file.OpenRead(path)
Dim StreamReader As New StreamReader(fileStream, System.Text.Encoding.Default)
       '將xmlMenu.txt內容讀入XMLmenu變數中
XMLmenu = StreamReader.ReadToEnd
fileStream.Close()
StreamReader.Close()
End If


  你可以修改成,管理者讀取xmlMenuManager.txt,一般使用者讀取xmlMenuUser.txt;或是不同部門需要不同的內容,你只要依部門建議所需要xmlMenuSales.txt…,在寫個判斷程式,這樣就是一個簡單的權限管理方法,不同的人、不同的部門、不同的權限看到不同的東西。

  這方面就給各位去發揮了。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。