ASP進階學習:資料庫動態產生樹形目錄

來源:互聯網
上載者:User
一、  分類樹的廣泛應用
  為了這段內容,在百度上搜了搜,內容一大通,相關的竟沒有。搜什麼搜嘛?用處不是明擺著嗎?資源管理員檔案夾的管理,論壇中多級論壇的管理,JAVA中的AWT正是缺乏包括樹形目錄這樣的組件才用處受限......誰這麼沒禮貌,一點面子都不給,叫我怎麼講下去?清了清嗓子:

  在我們項目中常常會出現自關聯的資料表,從整體看去,整個表就呈現為一個樹形資料結構。當我們對這個表進行顯示、編輯時,如果不採用好的表現形式,會顯得很笨拙,採用樹形目錄進行管理顯然是一個不錯的主意。
  (斧子掄了一圈,感覺好極了,接著講...)在WEB中樹形目錄可以用javascript實現,但一些細節問題上例如樹形目錄傳值(點擊一個子節點,開啟相關連結),多級目錄以及節點的增加、刪除、拖動上受各種制肘。其實採用第三方控制項顯然也是個不錯的主意。

  二、  關於智島分類樹控制項

  好,我們今天的主人公--輕便犀利的智島分類樹控制項(下載地址:http://www.oapro.com/ostarocx/download/OTree.ocx)出場了。它採用VC++6.0開發,是標準的OCX控制項,可以應用於Windows環境下VB、VC、PB、Dephi、ASP、JSP等程式設計語言中。它採用XML檔案作為介面檔案,該介面檔案既可以是一個現成的檔案,也可以是動態產生的XML格式檔案(換句話說可以基於資料庫動態組建目錄樹節點)。智島分類樹控制項支援節點的複製、移動、重新命名以及許可權控制項,並且沒有對目錄的層數進行限制。介紹了這麼多,想必欲欲越試了。在ASP中小試牛刀先:

  三、  註冊添加控制項
 
  1. 註冊智島分類樹控制項

  下載(下載地址:http://www.oapro.com/ostarocx/download/OTree.ocx)智島分類樹控制項(其檔案名稱為OTree.ocx)後,按照如下方法註冊控制項:

  點擊“開始”→“運行”;在運行對話方塊中輸入以下命令:
  regsvr32 < OTree.ocx檔案的絕對路徑>  註冊智島分類樹控制項控制項
  regsvr32 /u < OTree.ocx檔案的絕對路徑> 解除智島分類樹控制項的註冊

  2. 在頁面中添加智島分類樹控制項

  在頁面中加入以下代碼,即可插入智島分類樹控制項:

  <object classid="clsid:D835ED15-0BD0-4F24-AC76-A60175AE1137" id="OTree" width="150" height="0"
  CODEBASE="http://www.oapro.com/ostarocx/download/OTree.ocx">
   <param name="_Version" value="65536">
   <param name="_ExtentX" value="2646">
   <param name="_ExtentY" value="1323">
   <param name="_StockProps" value="0">
</object>

  其中:
  width和height:指控制項的顯示寬度和高度;
  id:指控制項對象的名稱,通過該名稱實現對控制項的操作;
  CODEBASE:指沒有安裝智島分類樹控制項的用戶端運行該頁面時自動下載安裝該控制項的地址。

  三、  從XML檔案產生樹形目錄

  1. XML文檔格式


XML是個好東東,不過也要符合一定的格式呀,不然控制項可不認哦!下面是一份XML文檔格式:

  <?xml version="1.0" encoding="GB2312"?>
  <NaviTree>
  <NodeItem>
  <NodeName> </NodeName><!--節點名稱-->
  <NodeType> </NodeType><!--節點類型-->
   <NodeData> </NodeData><!--節點資料-->
  <ImageIndex> </ImageIndex><!--節點圖片-->
  <Creator> </Creator><!--產生者-->
  <RightDepartmen>|開發部|</RightDepartmen><!--對此目錄有權的部門-->
  <RightUser> </RightUser><!--對此目錄有權的使用者-->
  <Lock> </Lock><!--是否鎖定0/1-->
  </NodeItem>
         ...
  </NaviTree>

其中:

  NodeName:指節點名稱,如有上級節點,要包括上級節點名稱,節點名稱間以符號"\"分隔。例“我的辦公桌\公告通知\電子郵件”表明根節點為“我的辦公桌”,父節點為“公告通知”,本節點為“電子郵件”。如果問你包含五級的節點名稱是怎樣時,呵呵,不要拿西紅柿扔我!

  NodeType:節點類型,一般均指“href”。
  ImageIndex:節點名稱前顯示的小表徵圖,其中0表示檔案夾狀表徵圖,4表示資料表狀表徵圖。

  下面是一份xml格式文檔源碼:

  <?xml version="1.0" encoding="GB2312"?>
  <NaviTree>
   <NodeItem>
      <NodeName>我的辦公桌</NodeName><!--節點名稱-->
      <NodeType>href</NodeType><!--節點類型-->
      <NodeData>MyDesk.aps</NodeData><!--節點資料-->
      <Lock>0</Lock><!--是否鎖定0/1-->


<ImageIndex>0</ImageIndex>
     </NodeItem>
     <NodeItem>
      <NodeName>我的辦公桌\公告通知</NodeName><!--節點名稱-->
      <NodeType>href</NodeType><!--節點類型-->
      <NodeData>公告通知.aps</NodeData><!--節點資料-->
      <Lock>0</Lock><!--是否鎖定0/1-->
      <ImageIndex>0</ImageIndex>
   </NodeItem>
   <NodeItem>
      <NodeName>我的辦公桌\公告通知\電子郵件</NodeName><!--節點名稱-->
      <ImageIndex>0</ImageIndex>
      </NodeItem>
      <NodeItem>
      <NodeName>我的辦公桌\公告通知\電子郵件\收件匣</NodeName><!--節點名稱-->
      <ImageIndex>4</ImageIndex>
   </NodeItem>
   <NodeItem>
      <NodeName>我的辦公桌\公告通知\電子郵件\寄件匣</NodeName><!--節點名稱-->
      <ImageIndex>4</ImageIndex>
      </NodeItem>
   <NodeItem>
      <NodeName>我的辦公桌\公告通知\電子郵件\已發郵件</NodeName><!--節點名稱-->
   </NodeItem>
   <NodeItem>
      <NodeName>我的辦公桌\排程</NodeName><!--節點名稱-->
      <ImageIndex>0</ImageIndex>
   </NodeItem>
   <NodeItem>
      <NodeName>我的辦公桌\排程\日曆</NodeName><!--節點名稱-->
   </NodeItem>
  </NaviTree>

2. 代碼實現

  通過以下語句通知智島分類樹控制項開啟XML文檔:

  OTree.OpenXMLFile("")

  其中引號內XML文檔的絕對路徑,例如:
  OTree.OpenXMLFile("C:\OTree.xml")

  運行效果見下圖:

  已看見你頻頻點頭的樣子,但又喃喃自語:如果要根據資料庫中內容產生樹形目錄該...?呵呵,下面我們就進入正題(敢情前面這麼多文字是騙稿費的啊?誰?噓...,小聲點,千萬別讓小編聽見):

  四、  基於資料庫產生樹形目錄

1. XML文檔格式

  將樹形目錄的節點存入資料庫,為我們動態形成樹形目錄打下良好的基礎。當然,也有些分類樹是表現一個資料庫中的資料結構(父節點是資料庫名,子節點是資料表)。不管如何,有了前面的基礎,現在我們所需做的只是將資料庫的內容形成上面格式的XML文檔。下面有一份ASP源碼,將資料庫中結構形成XML文檔,其中變數datasource儲存傳遞過來的資料庫名稱。

  <?xml version="1.0" encoding="GB2312"?>
  <NaviTree>
  <%
   dim datasource
   datasource=request("datasource")
  %>
   <NodeItem>
      <NodeName><%=datasource%>
      <NodeType></NodeType>
      <NodeData></NodeData>
      <ImageIndex>0</ImageIndex>
      <Creator></Creator>
      <RightDepartmen>|開發部|市場部|</RightDepartmen>
      <RightUser></RightUser>
      <Lock>0</Lock>
   </NodeItem>
  <%


strConn="DBQ="+server.mappath("db\"&datasource)+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
   set objConn=server.createobject("Adodb.connection")
   objConn.open strConn
   set rsSchema=objConn.openSchema(20)
   rsSchema.movefirst
   Do Until rsSchema.EOF
      if rsSchema("TABLE_TYPE")="TABLE" then
  %>
   <NodeItem>
      <NodeName><%=datasource%>\<%=rsSchema("Table_Name")%></NodeName>
      <NodeType>href</NodeType>
      <NodeData><%=rsSchema("Table_Name")%></NodeData>
      <ImageIndex>4</ImageIndex>
      <Creator></Creator>
      <RightDepartmen>|開發部|市場部|</RightDepartmen>
      <RightUser></RightUser>
      <Lock>0</Lock>
   </NodeItem>
  <%
      end if
      rsSchema.movenext
   Loop
   set objConn=nothing
  %>

  </NaviTree>

  2. 代碼實現

  這時候的介面方法跟直接開啟XML文檔的不一樣了:
  OTree.SetNodeXML(OTree.HttpGet("http://www.oapro.com/ostarocx/sample/Dataman/OTree.asp","datasource=OTree.mdb"))

  其中方法HttpGet有二個參數,第一個參數為我們上面介紹的實現資料庫轉換XML格式的網頁地址,一定要為網址格式,不能用相對或絕對路徑(因為目前該方法尚不支援),第二個參數為傳遞到該檔案的參數,這裡我們傳遞的是資料庫名稱。

  按照上面的介紹你很快的實現了一個樹形目錄,點根節點,展開,點父節點,展開,再點...,咦,怎麼沒反應?你希望有什麼反應?噢,不好意思,差點忘介紹了: 

   五、  響應節時間點事件

  智島樹形目錄控制項提供了一個介面方法用以響應節時間點事件:

  EventTreeSelchanged(strItemName, strItemData,strItemType)

  其中:

  strItemName 節點名稱
  strItemData 節點資料
  strItemType 節點類型
  這三個參數由智島樹形目錄控制項提供給我們開發人員,供我們調用。
 
  我們可通過指令碼實現對事件的觸發,以下是一範例代碼:

  <SCRIPT FOR="OTree" EVENT="EventTreeSelchanged(strItemName, strItemData, strItemType)" LANGUAGE="javascript" >
   alert(strItemName);
  </SCRIPT>

  以上代碼實現了點擊節點時,彈出一對話方塊顯示該節點的名稱。

  六、  範例

  嗯,好累呀!用敲鍵盤敲得差點變形的小手揉揉看螢幕看得發酸的大眼睛,又閃過一個念頭,再給出一個範例吧:http://www.oapro.com/ostarocx/sample/ogrid_f 。在這個範例中,從下拉框中選擇資料庫名稱後樹形目錄的內容會發生變化,點擊節點會顯示該節點所代表的資料表中的資料內容。整個範例充分展示了上面文章內容的技術細節。下面是範例截圖:



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。