인터넷에서 asp의 카테고리를 무제한으로 찾기 시작했는데 asp.net은 거의 찾을 수 없었고, 찾은 것들은 TreeView와 결합되어 있었습니다.
ASP 버전에 대한 여러 코드가 발견되었으며 모두 재귀 알고리즘을 사용하는 것으로 나타났습니다.
테이블 구조는 다음과 같습니다.
테이블 이름은 ClassName입니다.
ID 기본 키
sid에 해당하는 상위 클래스의 ID
ClassName은 카테고리의 이름에 해당합니다.
코드 조각 1:
1함수 loadNextType(upid,rank)
조광기 2개
3 rs="sid="&upid인 클래스 이름에서 *를 선택하세요.
4 rs.eof가 아닌 동안 수행
5 loadNextType=loadNextType &rs("클래스 이름")&"<br>"& string("-",rank) & loadNextType(rs("id"),rank+1)
6rs.movenext
7루프
8end 함수가 호출될 때: response.write(loadNextType(0,0))
다른 코드 부분은 위의 원칙과 동일하며 트리 구조 표시 방법만 추가합니다.
코드 조각 2:
1'첫 번째 수준 분류를 정의합니다.
2서브 메인플로()
조광기 3개
4 set rs=conn.execute("ClassNae에서 id,F_id,F_name 선택, sid=0 order by id desc")
5 rs.eof가 아니면
6 rs.eof가 아닌 동안 수행
7 response.write rs(2) & "<br>"
8 subfl(rs(0)," |-") '루프 하위 수준 분류 호출
9rs.movenext
10 if rs.eof then exit do '무한 루프를 방지하려면
11개의 루프
12 끝이면
13엔드 서브
14'하위 카테고리 정의
15sub 하위 파일(fid,strdis)
조광기 16개1
17 set rs1=conn.execute("Select id,sid,ClassName from ClassName where sid="&fid&" order by id desc")
rs1.eof가 아니면 18
19 rs1.eof가 아닌 동안 수행
20 response.write 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(문자열 parentid/**//*, int 순위*/)
2 {
3 SqlDataReader 박사;
4 SqlCommand cmd;
5 문자열 strSQL;
6
7 strSQL = "선택 * 트리에서 ParentID =" + parentid + "ID DESC로 주문";
8 cmd = new SqlCommand(strSQL,conn);
9 //cmd.Connection.Open();
10
11(dr = cmd.ExecuteReader())를 사용하여
12 {
13 동안(dr.Read())
14 {
15 Response.Write(dr["이름"].ToString() + "<br>");
16 Display(dr["ID"].ToString());
17}
18}
19 cmd.Connection.Close();
20}디스플레이("0")를 사용하여 호출합니다.
오류가 발생하는 이유는 SqlDataReader를 사용할 때마다 닫아야 하므로 DataReader를 중첩할 수 없기 때문입니다.
나중에 무제한 분류를 위해 DataTable을 사용하는 방식으로 변경했지만 이 방법은 효율적이지 않고 개선이 필요하다고 생각합니다(아직 연구 중).
수정된 코드는 다음과 같습니다.
1private void 표시(문자열 부모 ID, 문자열 공간)
2 {
3 데이터테이블 dt;
4 문자열 strSQL;
5 strSQL = "Select * From Tree Where ParentID =" + parentid + " ID DESC별 주문";
6
7 SqlDataAdapter sda = new SqlDataAdapter(strSQL, conn);
8 데이터세트 ds = new DataSet();
9 sda.Fill(ds, "트리");
10 dt = ds.Tables["트리"];
11
12 if (dt.Rows.Count > 0)
13 {
14 foreach(dt.Rows의 DataRow dr)
15 {
16 strOpinion += 공백 + "<글꼴 색상=빨간색>[" + dr["이름"].ToString() +"<br>";
17 Display(dr["ID"].ToString(), " " + 공백, false);
18}
19}
20} 호출시에는 Display("0","↓→→")를 사용하세요.
무제한 분류가 이루어졌지만 효율성은 여전히 매우 낮습니다.
출처: P.Dragon 블로그