Comecei a procurar categorias ilimitadas de asp na Internet, mas dificilmente consegui encontrar asp.net, e as que encontrei foram combinadas com TreeView.
Existem vários códigos para a versão asp encontrados e todos eles usam algoritmos recursivos.
As estruturas da tabela são as seguintes:
O nome da tabela é ClassName
chave primária de identificação
O id da classe pai correspondente ao sid
ClassName corresponde ao nome da categoria.
Trecho de código um:
1função loadNextType(upid,rank)
2 dimmers
3 set rs="select * from classname where sid="&upid
4 faça enquanto não rs.eof
5 loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",classificação) & loadNextType(rs("id"),rank+1)
6rs.movenext
7 voltas
Quando a função 8end é chamada: response.write(loadNextType(0,0))
O outro trecho de código é igual ao princípio acima. Ele apenas adiciona um método de exibição de estrutura em árvore.
Trecho de código dois:
1'Definir a classificação de primeiro nível
2sub mainfl()
3 dimmers
4 set rs=conn.execute("selecione id,F_id,F_name de ClassNae onde sid=0 ordene por id desc")
5 se não rs.eof então
6 faça enquanto não rs.eof
7 resposta.write rs(2) & "<br>"
8 call subfl(rs(0)," |-") 'Classificação de subnível do loop
9rs.movenext
10 if rs.eof then exit do 'Para evitar um loop infinito
11 voltas
12 terminar se
13 final sub
14'Definir subcategorias
15sub subfl(fid,strdis)
16 dimrs1
17 set rs1=conn.execute("selecione id,sid,ClassName de ClassName onde sid="&fid&" ordene por id desc")
18 se não rs1.eof então
19 faça enquanto não rs1.eof
20 resposta.write rs1(2) & "<br>"
21 call subfl(rs1(0)," "&strdis) 'Classificação recursiva de subnível
22 rs1.movnext
23 se rs1.eof então
24 rs1.fechar
25 saída sub
26 terminar se
27 voltas
28 terminar se
29 final sub
Referi-me ao código acima e mudei para a versão asp.net de classificação ilimitada. Comecei a encontrar limitações gramaticais. A solução naquele momento era substituir diretamente rs por SqlDataReader e depois modificá-lo. código):
A estrutura em árvore da tabela do banco de dados de teste é: id, ParentID, Name.
1private void Display(string parentid/**//*, int rank*/)
2 {
3 SqlDataReader dr;
4 cmd SqlCommand;
5 StringsstrSQL;
6
7 strSQL = "Selecionar * Da Árvore Onde ParentID =" + parentid + "Ordenar por ID DESC";
8 cmd = novo SqlCommand(strSQL,conn);
9 //cmd.Connection.Open();
10
11 usando (dr = cmd.ExecuteReader())
12 {
13 enquanto(dr.Read())
14 {
15 Response.Write(dr["Nome"].ToString() + "<br>");
16 Display(dr["ID"].ToString());
17}
18}
19 cmd.Connection.Close();
20}Chame usando Display("0").
O motivo do erro é que o SqlDataReader precisa ser fechado após cada uso, portanto o DataReader não pode ser aninhado.
Posteriormente, mudei para o DataTable para obter classificação ilimitada, mas sinto que esse método não é eficiente e precisa de melhorias (ainda em pesquisa)
O código modificado é o seguinte:
1private void Display (string parentid, String space)
2 {
3 DataTabledt;
4 StringsstrSQL;
5 strSQL = "Selecionar * Da Árvore Onde ParentID =" + parentid + "Ordenar por ID DESC";
6
7 SqlDataAdapter sda = novo SqlDataAdapter(strSQL, conn);
8 DataSet ds = new DataSet();
9 sda.Fill(ds, "Árvore");
10 dt = ds.Tables["Árvore"];
11
12 se (dt.Rows.Count > 0)
13 {
14 foreach (DataRow dr em dt.Rows)
15 {
16 strOpinion += espaço + "<font color=red>[" + dr["Nome"].ToString() +"<br>";
17 Display(dr["ID"].ToString(), " " + espaço, falso);
18}
19}
20} Use Display("0","↓→→") ao ligar.
Embora a classificação ilimitada tenha sido alcançada, a eficiência ainda é bastante baixa. Nós nos esforçamos para explorar uma maior eficiência.
Fonte: Blog do P.Dragon