J'ai commencé à chercher des catégories illimitées d'asp sur Internet, mais j'ai eu du mal à trouver asp.net, et celles que j'ai trouvées ont été combinées avec TreeView.
Il existe plusieurs codes trouvés pour la version asp, et il s'avère qu'ils utilisent tous des algorithmes récursifs.
Les structures des tableaux sont les suivantes :
Le nom de la table est ClassName
clé primaire d'identification
L'identifiant de la classe parent correspondant à sid
ClassName correspond au nom de la catégorie.
Extrait de code 1 :
1fonction loadNextType (upid, rang)
2 variateurs
3 définissez rs="select * from classname où sid="&upid
4 faire sans rs.eof
5 loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",rank) & loadNextType(rs("id"),rank+1)
6rs.movenext
7 boucles
Lorsque la fonction 8end est appelée : response.write(loadNextType(0,0))
L'autre morceau de code est le même que le principe ci-dessus. Il ajoute simplement une méthode d'affichage de la structure arborescente.
Extrait de code deux :
1'Définir le classement de premier niveau
2sub mainfl()
3 variateurs
4 set rs=conn.execute("select id,F_id,F_name from ClassNae which sid=0 order by id desc")
5 sinon rs.eof alors
6 faire sans rs.eof
7 réponse.write rs(2) & "<br>"
8 call subfl(rs(0)," |-") 'Classification des sous-niveaux de boucle
9rs.movenext
10 si rs.eof alors exit do 'Pour éviter une boucle infinie
11 boucles
12 fin si
13fin sous
14'Définir les sous-catégories
15sub subfl(fid,strdis)
16 dimensions1
17 set rs1=conn.execute("select id,sid,ClassName from ClassName which sid="&fid&" order by id desc")
18 sinon rs1.eof alors
19 faire sans être rs1.eof
20 réponse.write rs1(2) & "<br>"
21 call subfl(rs1(0)," "&strdis) 'Classification récursive des sous-niveaux
22 rs1.movenext
23 si rs1.eof alors
24 rs1.fermer
25 sortie sous
26 fin si
27 boucles
28 fin si
29fin du sous-marin
J'ai fait référence au code ci-dessus et je l'ai remplacé par la version asp.net de classification illimitée. La solution à ce moment-là était de remplacer directement rs par SqlDataReader, puis de le modifier. Le code est le suivant (erreur). code):
L'arborescence des tableaux de la base de données de test est la suivante : id, ParentID, Name.
1affichage vide privé (string parentid/**//*, rang int*/)
2 {
3 fichier SQLDataReader ;
4 Commande SQLCommand ;
5 Chaîne strSQL ;
6
7 strSQL = "Sélectionner * Depuis l'arborescence où ParentID =" + parentid + "Ordre par ID DESC" ;
8 cmd = nouveau SqlCommand(strSQL,conn);
9 //cmd.Connection.Open();
10
11 en utilisant (dr = cmd.ExecuteReader())
12 {
13 pendant que(dr.Read())
14 {
15 Réponse.Write(dr["Nom"].ToString() + "<br>");
16 Affichage(dr["ID"].ToString());
17}
18}
19 cmd.Connection.Close();
20}Appel via Display("0").
La raison de l'erreur est que SqlDataReader doit être fermé après chaque utilisation, donc DataReader ne peut pas être imbriqué.
Plus tard, j'ai changé pour utiliser DataTable pour obtenir une classification illimitée, mais je pense que cette méthode n'est pas efficace et doit être améliorée (toujours en cours de recherche)
Le code modifié est le suivant :
1affichage vide privé (identifiant parent de chaîne, espace de chaîne)
2 {
3 DataTabledt ;
4 chaînes strSQL ;
5 strSQL = "Sélectionner * Depuis l'arborescence où ParentID =" + parentid + " Trier par ID DESC" ;
6
7 SqlDataAdapter sda = new SqlDataAdapter(strSQL, conn);
8 DataSetds = new DataSet();
9 sda.Fill(ds, "Arbre");
10 dt = ds.Tables["Arbre"];
11
12 si (dt.Rows.Count > 0)
13 {
14 foreach (DataRow dr dans dt.Rows)
15 {
16 strOpinion += espace + "<font color=red>[" + dr["Name"].ToString() +"<br>";
17 Display(dr["ID"].ToString(), " " + espace, false);
18}
19}
20} Utilisez Display("0","↓→→") lors de l'appel.
Bien qu'une classification illimitée ait été obtenue, l'efficacité est encore assez faible. Nous nous efforçons d'explorer une efficacité plus élevée.
Source : Blog de P.Dragon