上文我們提到了如何用treeview讀取和表示表中無限級分類的資料.
2)添加新節點,首先選擇父節點,範例代碼如下:
//得到父節點的typeid
int typeid = Convert.ToInt32(Request["pid"]);
//得到父節點的所有欄位的值
SqlDataReader dr = man.gettypeaMess(typeid);
while (dr.Read())
{
pid = Convert.ToInt32(dr["TypeId"].ToString());
name = typename.Text;
man.addtype(pid, name);
spth = dr["spath"].ToString();
child = dr["childrenID"].ToString();
man.update(spth);
man.upechildid(pid, child);
}
其中man.gettypeaMess(typeid)方法是我定義的根據父節點typeID得到父節點所有欄位的值包括SPATH,CHILDRENID等.update()和upechildid()方法分別是根據父節點SPATH和CHILDRENID得到新節點的SPATH和父節點要增加一個child的id,然後更新對應的資料庫代碼如下:/**//// <summary>
/// 更新路徑
/// </summary>
/// <param name="spath"></param>
public void update(string spath)
{
int type=dbExecuteSql4Value("select top 1 typeid from QType order by typeid desc");
string path=spath+","+Convert.ToString(type);
dbExecuteSql("update QType set spath='" + path + "' where TypeId=" + type);
}
/**//// <summary>
/// 更新父類childid
/// </summary>
/// <param name="typeid"></param>
/// <returns></returns>
public void upechildid(int typeid,string child)
{
string childid;
int type = dbExecuteSql4Value("select top 1 typeid from QType order by typeid desc");
if (child.Length==0)
{childid= Convert.ToString(type);}
else{
childid = child + "," + Convert.ToString(type);}
dbExecuteSql("update QType set childrenID='" + childid + "' where TypeId=" + typeid);
}
3)刪除節點
做到刪除 節點我們需要的是將它的子節點一併刪除,看似很難實現,但我們有了spath實現時就十分簡單了首先當然得得到所要刪除節點的typeid,然後代碼如下: public void deletetype(string typeid)
{
int tid = Convert.ToInt32(typeid);
dbExecuteSql("delete from QType where CHARINDEX(',"+tid+",',spath)>0");
dbExecuteSql("delete from QType where TypeId=" + tid);
}
在這裡最重要的就是CHARINDEX了,不明白就去查查吧,我這就不詳述了.
其他的操作就變的十分簡單了,有的與上面的大同小異,這個演算法不是很難,但是基本上可以實現無限級分類的要求.