webForumDet fria alternativet

Fylla en dropdownlist rekursivt

.NET

5 svar · 371 visningar · startad av jazzil

Medlem sedan maj 2003151 inlägg
Frågan#1

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

Väldigt tacksam för hjälp.

Medlem sedan sep. 20026 425 inlägg
#2

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
Medlem sedan maj 2003151 inlägg
#3

Jag skrev om det till ngt sådant.

		private void Page_Load(object sender, System.EventArgs e)
		{
			CatList.Items.Add(new ListItem("Ingen", "0"));
			fillRec(0);
		}

		private void fillRec(int parent_id)
		{
			string SQL = "SELECT * FROM tbl_kategorier WHERE pappa_id="+parent_id;
			string ConString =  "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=****.mdb;User Id=admin;Password=;";
			OleDbConnection olCon = new OleDbConnection(ConString);
			OleDbCommand olCommand = new OleDbCommand(SQL, olCon);
			olCon.Open();
			OleDbDataReader dr = olCommand.ExecuteReader();
			
			while(dr.Read())
			{
				CatList.Items.Add(new ListItem(dr["kat_namn"].ToString(),dr["id"].ToString()));
				fillRec(Convert.ToInt32(dr["id"]));		
			}
			
			dr.Close();
			olCon.Close();
		}

Och nu sorterar den rätt .. 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 ">>"..

Tacksam

Medlem sedan sep. 20026 425 inlägg
#4

/r dinohjärnan var framme.. ;)

Medlem sedan maj 20012 812 inlägg
#5

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);		
}
...
}

- M

Medlem sedan maj 2003151 inlägg
#6

Att det var så lätt .. tack så mycket!

286 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
147 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
137 ms — ändringar (db)