用C 獲取無限多級分類的實現

2021-04-12 22:18:31 字數 1827 閱讀 8887

所做的小專案中需要多級分類, 試著學習實現多級分類。由於對儲存過程本身並不大熟悉,也不想借助於treeview,於是遞迴邏輯採用c#實現,配合數資料庫完成了多級分類的獲取方法。增加分類節點應該說是比較簡單的,此文暫略。

資料庫表:categoryinfo

欄位名           型別

ciid                  int                        //記錄序號,自增量

ciname         nvarchar(20)       //分類名

ciparent           int                       //父分類序號

cilayer              int                      //所處的層次

cidescription     nvarchar(200)   //對分類的描述

分類的類設計

public class categoryinfo

public categoryinfo(int cid, string cname, int cparent, string cdescription, int clayer)

//屬性

public int categoryid

set

}public string categoryname

set

}public int categoryparent

set

}public string categorydescription

set

}public int categorylayer

set }}

獲取子分類的儲存過程

create  procedure [dbo].[category_getchild]

@cname nvarchar(20)

asbegin

declare @tmpid int

select @tmpid=ciid from categoryinfo

where rtrim(ciname) = rtrim(@cname)

if(@tmpid is not null)

select * from categoryinfo

where ciparent = @tmpid

order by cilayer 

end獲取子分類的函式

public ilistgetchildcategories(ilistcinfos,string cname)

說明:在該函式中,tmpnames如果換成是ilist,即它新增的元素與cinfos是一樣的時,如果要移除其中的一項,則cinfos中會同時移除一項。因為categoryinfo是類,是引用型別的,而非值型別。所以tmpnames採用了string型別,以避免這個問題。

對上面這個函式直接呼叫還稍嫌麻煩,上層程式還需要建立乙個ilist物件,因此可以增加乙個函式來呼叫上面的函式。這樣,上層程式只需要提供分類名,以及是否包含本級分類兩個引數就可以了。

//獲取子分類,其中布林引數表示是否包含本級分類

public ilistgetcategories( string cname, bool isincludeself)

return cinfos;

}注意:採用這種方式時,web伺服器獲取子分類時要在資料庫伺服器之間有多次往返,降低了效能。採用儲存過程實現遞迴邏輯,直接返回子分類列表的方式應該有更好的效能,尤其是web伺服器與資料庫伺服器不位於同一臺伺服器上時,更會受網路影響。

用迭代實現無限級分類

說起那個無限級分類,相信很多人都知道是什麼東西,也曾經做過。我也相信,大家用得最多的實現方式就是做乙個遞迴。最近我也要做乙個帶無限級分類的選單,但是我又不想用遞迴來做,所以我需要用其他方式來實現,那就是迭代了。首先,我需要定義乙個實體模型,這舉乙個省市無限級的例子 class loaction pu...

C 實現無限級分類樹

開發工具以及開發語言 visual studio.net 2005 c 資料庫 sql server 2000 資料庫名 ielkq 密碼為空 向裡面新增如下資料 注,其中的部門名稱是我亂來的 解釋 dept id是部門號,name dep是部門名稱,id dept是所屬的部門號,其意義是,如 de...

用遞迴的方法實現無限極分類

通常我在寫專案的時候,在寫一些例如 分類的時候會實現對應分類的上級分類,或者其它專案部門管理的上級部門的時候一般就會用到無限極分類來進行分類 第一步 首先在資料表設計的時候,如果要實現無限極分類,一般我會在資料表多新增乙個欄位pid,下面我通過一張新建的資料表來說明一下,1 建表 table str...