ฉันเริ่มค้นหาหมวดหมู่ของ asp บนอินเทอร์เน็ตไม่จำกัด แต่หา asp.net แทบไม่ได้เลย และประเภทที่ฉันพบก็รวมเข้ากับ TreeView แล้ว
พบรหัสหลายรหัสสำหรับเวอร์ชัน asp และปรากฎว่ารหัสทั้งหมดใช้อัลกอริธึมแบบเรียกซ้ำ
โครงสร้างตารางมีดังนี้:
ชื่อตารางคือ ClassName
รหัสคีย์หลัก
รหัสของคลาสพาเรนต์ที่สอดคล้องกับ sid
ClassName สอดคล้องกับชื่อของหมวดหมู่
ข้อมูลโค้ดหนึ่ง:
1 ฟังก์ชั่น loadNextType (upid อันดับ)
2 หรี่
3 ชุด rs="select * จาก classname โดยที่ sid="&upid
4 ทำในขณะที่ไม่ใช่ rs.eof
5 loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",อันดับ) & loadNextType(rs("id"),อันดับ+1)
6rs.ย้ายถัดไป
7 ห่วง
เมื่อเรียกใช้ฟังก์ชัน 8end: response.write(loadNextType(0,0))
ส่วนโค้ดอื่น ๆ จะเหมือนกับหลักการข้างต้น เพียงเพิ่มวิธีการแสดงโครงสร้างแบบต้นไม้
ข้อมูลโค้ดที่สอง:
1'กำหนดหมวดหมู่ระดับแรก
2sub mainfl()
3 หรี่
4 ชุด rs=conn.execute("เลือก id,F_id,F_name จาก ClassNae โดยที่ sid=0 เรียงลำดับตาม id desc")
5 ถ้าไม่ใช่ rs.eof แล้ว
6 ทำในขณะที่ไม่ใช่ rs.eof
7 ตอบกลับเขียน rs(2) & "<br>"
8 โทร subfl(rs(0)," |-") 'การจำแนกระดับย่อยวนซ้ำ
9rs.movenenext
10 ถ้า rs.eof ให้ออกให้ทำ 'เพื่อป้องกันการวนซ้ำไม่สิ้นสุด
11 ลูป
12 จบถ้า
ย่อยที่ 13 ท้าย
14'กำหนดหมวดหมู่ย่อย
15sub ย่อย (fid,strdis)
16 หรี่1
17 ชุด rs1=conn.execute("select id,sid,ClassName from ClassName Where sid="&fid&" order by id desc")
18 ถ้าไม่ใช่ rs1.eof แล้ว
19 ทำในขณะที่ไม่ใช่ rs1.eof
20 ตอบกลับเขียน rs1(2) & "<br>"
21 โทร subfl(rs1(0)," "&strdis) 'การจำแนกระดับย่อยแบบเรียกซ้ำ
22 rs1.ย้ายถัดไป
23 ถ้า rs1.eof แล้ว
24rs1.ปิด
25 ทางออกย่อย
26 จบถ้า
27 ห่วง
28 จบถ้า
ย่อยที่ 29 ท้าย
ฉันอ้างถึงโค้ดข้างต้นและเปลี่ยนเป็นเวอร์ชัน asp.net ของการจำแนกแบบไม่ จำกัด ฉันเริ่มพบข้อ จำกัด ทางไวยากรณ์ในขณะนั้นคือแทนที่ rs ด้วย SqlDataReader โดยตรงแล้วแก้ไขโค้ดดังต่อไปนี้ (ข้อผิดพลาด รหัส):
โครงสร้างตารางแผนผังของฐานข้อมูลทดสอบคือ: id, ParentID, Name
1 การแสดงโมฆะส่วนตัว (string parentid/**//*, int rank*/)
2 {
3 ดร. SqlDataReader;
4 SqlCommand cmd;
5 สตริง strSQL;
6
7 strSQL = "เลือก * จากแผนผังโดยที่ ParentID =" + parentid + "สั่งซื้อตาม ID DESC";
8 cmd = ใหม่ SqlCommand(strSQL,conn);
9 //cmd.Connection.Open();
10
11 การใช้(dr = cmd.ExecuteReader())
12 {
13 ในขณะที่(dr.Read())
14 {
15 Response.Write(dr["Name"].ToString() + "<br>");
16 Display(dr["ID"].ToString());
17}
18}
19 cmd.Connection.ปิด();
20}การโทรโดยใช้จอแสดงผล ("0")
สาเหตุของข้อผิดพลาดคือ SqlDataReader จำเป็นต้องปิดหลังการใช้งานแต่ละครั้ง ดังนั้น DataReader จึงไม่สามารถซ้อนกันได้
ต่อมาผมเปลี่ยนมาใช้ DataTable เพื่อให้จำแนกประเภทได้ไม่จำกัด แต่รู้สึกว่าวิธีนี้ไม่มีประสิทธิภาพและจำเป็นต้องปรับปรุง (ยังอยู่ระหว่างการวิจัย)
รหัสที่แก้ไขจะเป็นดังนี้:
1private void Display (สตริง parentid, พื้นที่สตริง)
2 {
3 DataTable dt;
4 สตริง strSQL;
5 strSQL = "เลือก * จากแผนผังโดยที่ ParentID =" + parentid + " สั่งซื้อตาม ID DESC";
6
7 SqlDataAdapter sda = SqlDataAdapter ใหม่ (strSQL, conn);
8 ชุดข้อมูล ds = ชุดข้อมูลใหม่();
9 sda.Fill(ds, "ต้นไม้");
10 dt = ds.Tables["Tree"];
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(), " " + ช่องว่าง, เท็จ);
18}
19}
20} ใช้ Display("0","↓→→") เมื่อโทร
แม้ว่าจะสามารถจำแนกประเภทได้อย่างไม่จำกัด แต่ประสิทธิภาพก็ยังค่อนข้างต่ำ เรามุ่งมั่นที่จะสำรวจประสิทธิภาพที่สูงขึ้น
ที่มา: บล็อกของ P.Dragon