لقد بدأت بالبحث عن فئات غير محدودة من asp على الإنترنت، لكن لم أتمكن من العثور على asp.net بصعوبة، وتم دمج الفئات التي وجدتها مع TreeView.
تم العثور على العديد من الرموز لإصدار asp، واتضح أنهم جميعًا يستخدمون خوارزميات متكررة.
هياكل الجدول هي كما يلي:
اسم الجدول هو ClassName
معرف المفتاح الأساسي
معرف الفئة الأصلية المقابلة لـ sid
ClassName يتوافق مع اسم الفئة.
مقتطف الكود الأول:
1 وظيفة تحميل NextType (upid، رتبة)
2 ديمر
3 مجموعة rs = "اختر * من اسم الفئة حيث sid = "&upid
4 تفعل في حين لا rs.eof
5loadNextType=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("اختر المعرف،F_id،F_name من ClassNae حيث sid=0 بالترتيب حسب المعرف")
5 إن لم يكن rs.eof ذلك الحين
6 تفعل في حين لا rs.eof
7 استجابة. كتابة آر إس (2) و "<br>"
8 استدعاء subfl(rs(0)," |-") 'تصنيف المستوى الفرعي للحلقة
9rs.movenext
10 إذا rs.eof ثم الخروج تفعل 'لمنع حلقة لا نهاية لها
11 حلقة
12 نهاية إذا
13 نهاية الفرعية
14' تحديد الفئات الفرعية
15sub سوبفل (فيد، سترديس)
16 ديمر1
17 مجموعة rs1=conn.execute("اختر المعرف،sid،ClassName من ClassName حيث sid="&fid&" الترتيب حسب المعرف")
18 إن لم يكن rs1.eof ذلك الحين
19 افعل بينما لا rs1.eof
20 استجابة. اكتب rs1(2) و"<br>"
21 استدعاء subfl(rs1(0)," "&strdis) 'تصنيف المستوى الفرعي العودي
22 rs1.movenext
23 إذا rs1.eof ذلك الحين
24 روبية1.إغلاق
25 خروج فرعي
26 نهاية إذا
27 حلقة
28 نهاية إذا
29 نهاية الفرعية
لقد أشرت إلى الكود أعلاه وقمت بتغييره إلى إصدار asp.net للتصنيف غير المحدود وبدأت في مواجهة القيود النحوية. وكان الحل في ذلك الوقت هو استبدال rs مباشرة بـ SqlDataReader ثم تعديله كما يلي (خطأ شفرة):
هيكل شجرة الجدول لقاعدة بيانات الاختبار هو: المعرف، معرف الوالدين، الاسم.
1 عرض فارغ خاص (معرف السلسلة/**//*، رتبة int*/)
2 {
3 SqlDataReader الدكتور.
4 سقلكوماند كمد؛
5 سلسلة strSQL؛
6
7 strSQL = "اختر * من الشجرة حيث معرف الوالدين =" + معرف الوالدين + "الطلب حسب المعرف DESC";
8 cmd = new 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}الاتصال باستخدام العرض("0").
سبب الخطأ هو أن SqlDataReader يحتاج إلى الإغلاق بعد كل استخدام، لذلك لا يمكن تداخل DataReader.
فيما بعد قمت بالتغيير إلى استخدام DataTable لتحقيق تصنيف غير محدود، لكني أشعر أن هذه الطريقة غير فعالة وتحتاج إلى تحسين (لا تزال قيد البحث)
الكود المعدل هو كما يلي:
1 عرض فارغ خاص (معرف السلسلة، مساحة السلسلة)
2 {
3 DataTable dt;
4 سلسلة strSQL؛
5 strSQL = "اختر * من الشجرة حيث معرف الوالدين =" + معرف الوالدين + "الترتيب حسب المعرف DESC";
6
7 SqlDataAdapter sda = new SqlDataAdapter(strSQL, conn);
8 DataSet ds = new DataSet();
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 += space + "<font color=red>[" + dr["Name"].ToString() +"<br>";
17 Display(dr["ID"].ToString(), " " + مسافة, false);
18}
19}
20} استخدم العرض ("0"، "↓ → →") عند الاتصال.
على الرغم من تحقيق تصنيف غير محدود، إلا أن الكفاءة لا تزال منخفضة جدًا، ونحن نسعى جاهدين لاستكشاف كفاءة أعلى.
المصدر: مدونة P.Dragon