Skapa en treeview med ASP, Javascript och Access - del 1 av 3
Förord
Detta är den första av 3 artiklar där målet är att skapa en applikation som som fungerar precis som Treeviewkomponenten från visualasp. Vår applikation kommer att efter artikel 3, se ut som bilden visar till höger. Där man i webbläsaren skapar/redigera mappar och skapar/redigerar bokmärken. I denna första artikel så skall vi läsa upp information från databasen, mapparna, och populera trädet med dessa. Följande lösning går att använda på alla de projekt där man vill visa parent-children relationer. Gästböcker, Forums med mera.Innehåll
»»
»
»
»
»
»
Bakgrund
Denna applikation gjorde jag efter önskemål från våra säljare som är ofta är ute hos kund och demar våra system. För att kunna hålla reda på länkar till sidor och dokument så de behövde för att kunna sälja våra system så ville de ha ett system som man kunde komma åt från Internet och som skulle ha samma innehåll oberoende från vilken dator de använde.
Databas-layout
Denna version använder sig av en Access 2000 databas man jag rekomenderar att på produktionsservern använda en SQL server för att öka prestandan. Vi börjar med endast en tabell, tbl_folders, som ser ut som nedan.
Fältnamn
Datatyp
Övrigt
folderID tal Primär nyckel, räknare
parentFolder tal Standardvärde 0
folderName text Ej Null
Kod del 1
Det första vi gör är att hämta alla mappar som finns i roten. De mappar som har parentFolder = 0
<%@ Language=VBScript%>
<%
'Deklarera variabler
Dim path 'as String
Dim Conn 'as ADODB.Connection
Dim rs 'as ADODB.Recordset
Dim sSQL 'as String
Dim rootCount 'as Integer
'Sökväg till databsen
path = Server.MapPath("dbase/treeview.mdb")
'Skapa ett Connection Objekt
Set Conn=server.createobject("adodb.connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & path
'Skapa ett recordset
Set rs = Server.CreateObject("adodb.recordset")
'Hämta alla mappar som är i rotnivå. Det vill säga parentFolder = 0
sSQL = "SELECT * FROM tbl_folders WHERE parentFolder = 0"
rs.Open sSQL,Conn,3
'Hur många mappar finns i roten
rootCount = rs.RecordCount
%>
Kod del 2
Nästa del är en funktion som har till uppgift att hämta alla mappar i aktuell tråd och skriva ut dem. Funktionen har en in-parameter, parentID, som kommer att innhålla den aktiva mappens folderID.
<%
Function expand(parentID)
'Denna funktion tar värdet från parentID(aktiv mapp) som skickas in i funktionen och
'hämta alla childs.
'Deklarera variabler
Dim rsChild 'as ADODB.Recordset
Dim sSQLChild 'as String
Dim intRec 'as Integer
Dim intLoop 'as Integer
Dim parent 'as Integer
'Hämta alla mappar som har aktiv mapp som förälder
sSQLChild = "SELECT * FROM tbl_folders WHERE parentFolder = " & parentID
Set rsChild = Server.CreateObject("adodb.recordset")
rschild.Open sSQLchild,Conn,3
'Hur många mapper innehåller recordsetet
intRec = rschild.RecordCount
intLoop = 1
do until rschild.EOF or rschild.BOF
if parent <> rschild("folderID") Then
Response.Write ""
end if
if intLoop = intRec Then
if intRec = 0 Then
Response.Write " " & rschild("FolderName")
else
Response.Write " " & rschild("FolderName")
end if
call expand(rschild("folderID"))
Response.Write "< /td>< /tr>
"
else
if intRec = 0 Then
Response.Write "< /td> " & rschild("FolderName")
else
Response.Write " < /td> " & rschild("FolderName")
end if
'Vi kaller på denna funktion igen så att vi går ner hela vägen i till sista mappen i denna tråd.
call expand(rschild("folderID"))
Response.Write "< /td>< /tr>< tr>"
end if
intLoop = intLoop + 1
parent = rschild("folderID")
rschild.Movenext
loop
rschild.Close
set rschild = nothing
End function
%>
Kod del 3
Än så länge så har inte funktionen körts. Vi måste kalla på funktionen inom Bodytaggen. Har ni inte använt er av funkioner förut så råder jag er att läsa på om dessa. Kanske jag själv skriver något om dessa.
< body>
<%
i = 1
do until rs.eof or rs.bof
%>
<%
'Nedanstående IF..ELSE ..sats kollar var vi är i loopen och returnerar den rätta bilden och bakgrunden.
if i = rootCount Then
%>
<%else%>
<%if i = 1 Then%>
<%else%>
<%end if%>
<%end if%>
<%=rs("folderName")%>
<%
'Kalla på funktionen och skicka med mappen id.
call expand(rs("folderID"))
%>
<%
i = i + 1
rs.movenext
loop
rs.Close
set rs = Nothing
Conn.Close
Set Conn = Nothing
%>
0 Kommentarer