Ich begann im Internet nach unbegrenzten ASP-Kategorien zu suchen, konnte asp.net jedoch kaum finden und die gefundenen wurden mit TreeView kombiniert.
Es wurden mehrere Codes für die ASP-Version gefunden, und es stellte sich heraus, dass sie alle rekursive Algorithmen verwenden.
Die Tabellenstrukturen sind wie folgt:
Der Tabellenname ist ClassName
ID-Primärschlüssel
Die ID der übergeordneten Klasse, die Sid entspricht
ClassName entspricht dem Namen der Kategorie.
Codeausschnitt eins:
1Funktion loadNextType(upid,rank)
2 Dim
3 set rs="select * from classname where sid="&upid
4 tun, während nicht rs.eof
5 loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",rank) & loadNextType(rs("id"),rank+1)
6rs.movenext
7 Schleife
Wenn die 8end-Funktion aufgerufen wird: Response.write(loadNextType(0,0))
Der andere Teil des Codes ist derselbe wie das obige Prinzip. Er fügt lediglich eine Baumstruktur-Anzeigemethode hinzu.
Codeausschnitt zwei:
1'Definieren Sie die Klassifizierung der ersten Ebene
2sub mainfl()
3 Dimm
4 set rs=conn.execute("select id,F_id,F_name from ClassNae where sid=0 order by id desc")
5 wenn nicht rs.eof dann
6 tun, während nicht rs.eof
7 Antwort.write rs(2) & "<br>"
8 Rufen Sie subfl(rs(0)," |-") 'Schleife zur Klassifizierung der Unterebene auf
9rs.movenext
10 if rs.eof then exit do 'Um eine Endlosschleife zu verhindern
11 Schleifen
12 Ende wenn
13Ende sub
14'Definieren Sie Unterkategorien
15sub subfl(fid,strdis)
16 dimrs1
17 set rs1=conn.execute("select id,sid,ClassName from ClassName where sid="&fid&" order by id desc")
18 wenn nicht rs1.eof dann
19 tun, während nicht rs1.eof
20 Antwort.write rs1(2) & "<br>"
21 call subfl(rs1(0)," "&strdis) 'Rekursive Unterebenenklassifizierung
22 rs1.movenext
23 wenn rs1.eof dann
24 rs1.close
25 Ausgang U-Boot
26 Ende wenn
27 Schleife
28 Ende wenn
29end sub
Ich habe auf den obigen Code verwiesen und ihn in die asp.net-Version der unbegrenzten Klassifizierung geändert. Die Lösung bestand damals darin, rs direkt durch SqlDataReader zu ersetzen und ihn dann zu ändern Code):
Die Tabellenbaumstruktur der Testdatenbank lautet: ID, ParentID, Name.
1private void Display(string parentid/**//*, int rank*/)
2 {
3 SqlDataReader dr;
4 SqlCommand cmd;
5 String strSQL;
6
7 strSQL = "Select * From Tree Where ParentID =" + parentid + "Order By ID DESC";
8 cmd = new SqlCommand(strSQL,conn);
9 //cmd.Connection.Open();
10
11 using(dr = cmd.ExecuteReader())
12 {
13 while(dr.Read())
14 {
15 Response.Write(dr["Name"].ToString() + "<br>");
16 Display(dr["ID"].ToString());
17}
18}
19 cmd.Connection.Close();
20}Aufruf mit Display("0").
Der Grund für den Fehler liegt darin, dass SqlDataReader nach jeder Verwendung geschlossen werden muss, sodass DataReader nicht verschachtelt werden kann.
Später wechselte ich zur Verwendung von DataTable, um eine unbegrenzte Klassifizierung zu erreichen, aber ich habe das Gefühl, dass diese Methode nicht effizient ist und verbessert werden muss (noch in der Forschung).
Der geänderte Code lautet wie folgt:
1private void Display(string parentid, String space)
2 {
3 Datentabelle dt;
4 String strSQL;
5 strSQL = "Select * From Tree Where ParentID =" + parentid + " Order By ID DESC";
6
7 SqlDataAdapter sda = new SqlDataAdapter(strSQL, conn);
8 DataSet ds = new DataSet();
9 sda.Fill(ds, "Tree");
10 dt = ds.Tables["Tree"];
11
12 if (dt.Rows.Count > 0)
13 {
14 foreach (DataRow dr in dt.Rows)
15 {
16 strOpinion += space + "<font color=red>[" + dr["Name"].ToString() +"<br>";
17 Display(dr["ID"].ToString(), " " + Leerzeichen, false);
18}
19}
20} Verwenden Sie beim Aufruf Display("0","↓→→").
Obwohl eine unbegrenzte Klassifizierung erreicht wurde, ist die Effizienz immer noch recht niedrig. Wir streben nach einer höheren Effizienz.
Quelle: P.Dragon's Blog