Empecé a buscar categorías ilimitadas de asp en Internet, pero apenas podía encontrar asp.net, y las que encontré estaban combinadas con TreeView.
Se han encontrado varios códigos para la versión ASP y resulta que todos utilizan algoritmos recursivos.
Las estructuras de las tablas son las siguientes:
El nombre de la tabla es ClassName
identificación de clave primaria
La identificación de la clase principal correspondiente a sid.
ClassName corresponde al nombre de la categoría.
Fragmento de código uno:
1 función cargarNextType(upid,rank)
2 atenuadores
3 establezca rs="select * de nombre de clase donde sid="&upid
4 hacer mientras no rs.eof
5 loadNextType=loadNextType &rs("ClassName")&"<br>"& cadena("-",rango) & loadNextType(rs("id"),rango+1)
6rs.movenext
7 bucle
Cuando se llama a la función 8end: respuesta.write(loadNextType(0,0))
El otro fragmento de código es el mismo que el principio anterior. Simplemente agrega un método de visualización de estructura de árbol.
Fragmento de código dos:
1'Definir la clasificación de primer nivel
2sub principal()
3 atenuadores
4 set rs=conn.execute("seleccione id,F_id,F_name de ClassNae donde sid=0 ordene por id desc")
5 si no rs.eof entonces
6 hacer mientras no rs.eof
7 respuesta.escribir rs(2) & "<br>"
8 call subfl(rs(0)," |-") 'Clasificación de subnivel de bucle
9rs.movenext
10 si rs.eof entonces salga de do 'Para evitar un bucle infinito
11 bucles
12 final si
13subtítulo final
14'Definir subcategorías
15sub subfl(fid,stridis)
16 atenuaciones1
17 set rs1=conn.execute("seleccione id,sid,ClassName de ClassName donde sid="&fid&" ordene por id desc")
18 si no rs1.eof entonces
19 hacer mientras no rs1.eof
20 respuesta.escribir rs1(2) & "<br>"
21 call subfl(rs1(0)," "&strdis) 'Clasificación de subnivel recursiva
22 rs1.movenext
23 si rs1.eof entonces
24 rs1.cerrar
25 salidas secundarias
26 final si
27 bucle
28 terminar si
29 final sub
Me referí al código anterior y lo cambié a la versión asp.net de clasificación ilimitada. Comencé a encontrar limitaciones gramaticales. La solución en ese momento fue reemplazar directamente rs con SqlDataReader y luego modificarlo. código):
La estructura de árbol de la tabla de la base de datos de prueba es: id, ParentID, Nombre.
1Pantalla vacía privada (cadena parentid/**//*, int rango*/)
2 {
3 SqlDataReader dr;
4 cmd SqlCommand;
5 cadenas strSQL;
6
7 strSQL = "Seleccionar * del árbol donde ParentID =" + parentid + "Ordenar por ID DESC";
8 cmd = nuevo SqlCommand(strSQL,conn);
9 //cmd.Conexión.Open();
10
11 usando (dr = cmd.ExecuteReader())
12 {
13 mientras (dr.Read())
14 {
15 Response.Write(dr["Nombre"].ToString() + "<br>");
16 Pantalla(dr["ID"].ToString());
17}
18}
19 cmd.Conexión.Cerrar();
20}Llamar usando Display("0").
El motivo del error es que SqlDataReader debe cerrarse después de cada uso, por lo que DataReader no se puede anidar.
Más tarde, cambié a usar DataTable para lograr una clasificación ilimitada, pero siento que este método no es eficiente y necesita mejoras (aún en investigación).
El código modificado es el siguiente:
1Pantalla vacía privada (cadena parentid, espacio de cadena)
2 {
3 tabla de datos dt;
4 cadenas strSQL;
5 strSQL = "Seleccionar * del árbol donde ParentID =" + parentid + "Ordenar por ID DESC";
6
7 SqlDataAdapter sda = nuevo SqlDataAdapter(strSQL, conn);
8 Conjunto de datos ds = nuevo Conjunto de datos();
9 sda.Fill(ds, "Árbol");
10 dt = ds.Tables["Árbol"];
11
12 si (dt.Rows.Count > 0)
13 {
14 foreach (DataRow dr en dt.Rows)
15 {
16 strOpinion += espacio + "<color de fuente=rojo>[" + dr["Nombre"].ToString() +"<br>";
17 Display(dr["ID"].ToString(), " " + espacio, falso);
18}
19}
20} Utilice Display("0","↓→→") cuando llame.
Aunque se ha logrado una clasificación ilimitada, la eficiencia sigue siendo bastante baja. Nos esforzamos por explorar una mayor eficiencia.
Fuente: Blog de P.Dragon