Jag håller på att bygga en prislista som projektarbete i skolan till ett företag och jag har stött på lite problem.
Det är generellt hur man fyller något rekursivt. http://mekk.mine.nu/dps/admin/nykat.aspx
(Ser skit ut i IE, inte fixat dubbla css ännu)
Så finns det en dropdownlist som man ska välja vilken kategori som den nya ligger under.
Jag vill få det så att TFT som finns i listan ska ligga under skärmar och en bit indragen så att det tydligt syns att TFT är underkategori till Skärmar.
EDIT:
tabellen tbl_kategorier ser ut så här.
ID| NAMN |P_ID
1 | Skärmar | 0
2 | Nätverk | 0
3 | TFT | 1
Du lagrar ju info om TFT så att man vet att det är en underkategori till Skärmar. Då kan du använda dig av if-sats och kolla om en det är en underkategori som ska skrivas ut i dropdownlistan. I så fall lägger du till en post till dropdownlistan. Här är lite pseudokod:
Sub show_()
'plocka ut info ur tabellen
Dim SQL As string = "SELECT * FROM tbl_kategorier"
'felhantering med Try .. Catch
Try
'anslut till databasen & skapa ett OleDbDataReader-objekt
Dim Cn As OleDbConnection = new OleDbConnection(CnStr)
Dim Cm As OleDbCommand = new OleDbCommand(SQL,Cn)
Cn.Open()
Dim objDataReader As OleDbDataReader = Cm.ExecuteReader()
'skapa en ny samling av listposter (option-val i dropdownlistan i default.aspx)
Dim ddlBox As new ListItemCollection
'lägg till text
ddlBox.Add(new ListItem("Välj"))
ddlBox.Add(new ListItem())
'lägg till val i dropdownlistan
while(objDataReader.Read())
[b]if objDataReader("p_id")>0 then
ddlBox.Add(new ListItem(">> " & objDataReader("Namn"))
else
ddlBox.Add(new ListItem(objDataReader("Namn")))
end if[/b]
end while
'bind data till dropdownlistan
ddl_list.DataSource = ddlBox
ddl_list.DataBind()
'stäng objekt
objDataReader.Close()
Cn.Close()
'fånga felmeddelande
Catch ex As exception
lbl_error.Text = "Ett fel uppstod när visning av kategorier från databasen skulle ske..<br />Error: " & ex.Message
End Try
End Sub
men jag kan inte komma på hur jag ska räkna hur djupt i trädet den är så att jag kan skriva ut rätt antal ">>"..
Det är väldigt enkelt, du skickar med en extra parameter till din fillRec() funktion som berättar djupet. Alltså i Page_Load skickar du med 0 och har sedan en paramter deep som du tar emot i din fillRec och i din while loop så skickar du med deep + 1 till nästa anrop typ så här:
void page_load(){
...
fillRec(0,0);
...
}
void fillRec(int parentId, int deep){
...
while(dr.Read())
{
CatList.Items.Add(new ListItem(dr["kat_namn"].ToString(),dr["id"].ToString()));
fillRec(Convert.ToInt32(dr["id"]), deep + 1);
}
...
}