インターネット上で無制限のカテゴリの ASP を探し始めましたが、asp.net はほとんど見つかりませんでした。見つかったものは TreeView と組み合わせられていました。
ASP バージョンのコードがいくつか見つかりましたが、それらはすべて再帰アルゴリズムを使用していることがわかりました。
テーブル構造は次のとおりです。
テーブル名は ClassName です
ID主キー
sidに対応する親クラスのid
ClassName はカテゴリの名前に対応します。
コード スニペット 1:
1関数loadNextType(upid,rank)
2 調光器
3 set rs="select * from classname where sid="&upid
4 実行しますが、rs.eof を実行しません
5 loadNextType=loadNextType &rs("ClassName")&"<br>"& string("-",rank) &loadNextType(rs("id"),rank+1)
6rs.ムーブネクスト
7 ループ
8end 関数が呼び出された場合:response.write(loadNextType(0,0))
他のコードは上記の原理と同じで、ツリー構造の表示メソッドを追加するだけです。
コード スニペット 2:
1'第 1 レベルの分類を定義する
2sub mainfl()
3 調光
4 set rs=conn.execute("sid=0 の ClassNae から id、F_id、F_name を選択、id の説明で並べ替えます")
5 rs.eof でない場合
6 実行しますが、rs.eof を実行しません
7 応答.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("sid="&fid&" の ClassName から id,sid,ClassName を選択します。" ID の説明で並べ替えます")
rs1.eof でない場合は 18
19 rs1.eof ではないが行う
20 応答.write rs1(2) & "<br>"
21 call subfl(rs1(0)," "&strdis) '再帰的なサブレベル分類
22 rs1.movenext
23 rs1.eof の場合、その後
24 rs1.close
25 出口サブ
26 終了の場合
27 ループ
28 終了の場合
29エンドサブ
上記のコードを参照して、asp.net バージョンの無制限分類に変更しました。そのときの解決策は、rs を SqlDataReader に直接置き換えてから変更することでした。コードは次のとおりです。コード):
テスト データベースのテーブル ツリー構造は、id、ParentID、Name です。
1private void Display(string 親 ID/**//*, int ランク*/)
2 {
3 SqlDataReader dr;
4 SqlCommand コマンド。
5 文字列 strSQL;
6
7 strSQL = "Select * From Tree Where ParentID =" +parentid + "ID 順 DESC";
8 cmd = 新しい SqlCommand(strSQL,conn);
9 //cmd.Connection.Open();
10
11 using(dr = cmd.ExecuteReader())
12 {
13 while(dr.Read())
14 {
15 Response.Write(dr["名前"].ToString() + "<br>");
16 Display(dr["ID"].ToString());
17}
18}
19 cmd.Connection.Close();
20}Display("0") を使用して呼び出します。
エラーの理由は、SqlDataReader を使用するたびに閉じる必要があるため、DataReader をネストできないためです。
その後、無制限の分類を実現するために DataTable を使用するように変更しましたが、この方法は効率的ではなく、改善の必要があると感じています(まだ研究中です)
変更されたコードは次のとおりです。
1private void Display(文字列親ID、文字列スペース)
2 {
3 データテーブル dt;
4 文字列 strSQL;
5 strSQL = "Select * From Tree Where ParentID =" +parentid + " ID 順 DESC";
6
7 SqlDataAdapter sda = 新しい SqlDataAdapter(strSQL, conn);
8 データセット ds = 新しいデータセット();
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 += スペース + "<font color=red>[" + dr["Name"].ToString() +"<br>";
17 Display(dr["ID"].ToString(), " " + スペース、false);
18}
19}
20} 呼び出すときは Display("0","↓→→") を使用します。
無制限の分類は達成されていますが、効率はまだかなり低いです。
出典: P.Dragonのブログ