Я начал искать в Интернете неограниченные категории asp, но asp.net с трудом нашел, а те, что я нашел, были объединены с TreeView.
Найдено несколько кодов для версии asp, и оказывается, что все они используют рекурсивные алгоритмы.
Структуры таблиц следующие:
Имя таблицы — ClassName.
идентификатор первичного ключа
Идентификатор родительского класса, соответствующий sid
ClassName соответствует названию категории.
Первый фрагмент кода:
1 функция loadNextType (upid, ранг)
2 диммера
3 set rs="select * from classname, где sid="&upid
4 делай, пока не rs.eof
5 loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",rank) & loadNextType(rs("id"),rank+1)
6rs.movenext
7 петля
При вызове функции 8end: response.write(loadNextType(0,0))
Другой фрагмент кода аналогичен приведенному выше принципу. Он просто добавляет метод отображения древовидной структуры.
Фрагмент кода второй:
1'Определить классификацию первого уровня
2sub mainfl()
3 диммера
4 set rs=conn.execute("выберите id,F_id,F_name из ClassNae, где sid=0, упорядочите по идентификатору desc")
5 если не rs.eof то
6 делать, пока не rs.eof
7 response.write rs(2) & "<br>"
8 call subfl(rs(0)," |-") 'Классификация подуровней цикла
9rs.movenext
10 if rs.eof then exit do 'Чтобы предотвратить бесконечный цикл
11 петель
12 конец, если
13конечная замена
14'Определение подкатегорий
15sub subfl(fid,strdis)
16 размеров1
17 set rs1=conn.execute("выберите id,sid,ClassName из ClassName, где sid="&fid&" упорядочить по идентификатору desc")
18 если не rs1.eof то
19 делай, пока нет rs1.eof
20 ответ.пишите rs1(2) & "<br>"
21 call subfl(rs1(0)," "&strdis) 'Рекурсивная классификация подуровней
22 rs1.movenext
23 если rs1.eof тогда
24 rs1.закрыть
25 выходной сабвуфер
26 конец, если
27 петля
28 конец, если
29конечная субмарина
Я сослался на приведенный выше код и изменил его на версию неограниченной классификации asp.net. В то время я начал сталкиваться с грамматическими ограничениями. Решением на тот момент было напрямую заменить rs на SqlDataReader, а затем изменить его. Код выглядит следующим образом (ошибка). код):
Древовидная структура таблицы тестовой базы данных: id, ParentID, Name.
1private void Display(stringparentid/**//*, int Rank*/)
2 {
3 SqlDataReader др;
4 SqlCommand cmd;
5 строк стрSQL;
6
7 strSQL = "Выбрать * Из дерева, где ParentID =" + родительский ID + "Упорядочить по идентификатору DESC";
8 cmd = новый SqlCommand(strSQL,conn);
9 //cmd.Connection.Open();
10
11 с использованием (dr = cmd.ExecuteReader())
12 {
13 пока (доктор.Чтение())
14 {
15 Response.Write(dr["Name"].ToString() + "<br>");
16 Display(dr["ID"].ToString());
17}
18}
19 cmd.Connection.Close();
20}Вызов с помощью Display("0").
Причина ошибки в том, что SqlDataReader необходимо закрывать после каждого использования, поэтому DataReader не может быть вложенным.
Позже я перешел на использование DataTable для достижения неограниченной классификации, но чувствую, что этот метод неэффективен и требует улучшения (все еще исследуется).
Модифицированный код выглядит следующим образом:
1private void Display (строка родительского идентификатора, строковое пространство)
2 {
3 Таблица данных dt;
4 строки стрSQL;
5 strSQL = "Выбрать * Из дерева, где ParentID =" + родительский идентификатор + " Упорядочить по идентификатору DESC";
6
7 SqlDataAdapter sda = новый SqlDataAdapter(strSQL, conn);
8 DataSet ds = новый DataSet();
9 sda.Fill(ds, "Дерево");
10 dt = ds.Tables["Дерево"];
11
12, если (dt.Rows.Count > 0)
13 {
14 foreach (DataRow dr в dt.Rows)
15 {
16 strOpinion += пробел + "<font color=red>[" + dr["Name"].ToString() +"<br>";
17 Display(dr["ID"].ToString(), " " + пробел, false);
18}
19}
20} Используйте Display("0","↓→→") при звонке.
Несмотря на то, что была достигнута неограниченная классификация, эффективность все еще довольно низка. Мы стремимся к повышению эффективности.
Источник: Блог P.Dragon.