《用C#和數(shù)據(jù)庫實(shí)現(xiàn)無限級(jí)分類法》修正程序
2024-07-21 02:19:00
供稿:網(wǎng)友
上次寫了這篇文章后,馬上發(fā)覺有個(gè)錯(cuò)誤,即可能存在node漏加的情況。因在添加節(jié)點(diǎn)時(shí),只有一個(gè)循環(huán),當(dāng)添加節(jié)點(diǎn)時(shí),可能父節(jié)點(diǎn)還沒有添加,即找不到父親了,這就引起漏加。
真對(duì)不起,沒有慎重。不過俺平常就是很隨便的,一件事沒想成熟就去做,但發(fā)現(xiàn)錯(cuò)了,一定會(huì)訂正的。如果你不喜歡我這樣,就把文章扔在一邊吧。
原來程序:
/// <summary>
/// 重設(shè)商品分類的 treeview
/// resetsortview() 函數(shù)
/// </summary>
#region resetsortview()函數(shù)實(shí)現(xiàn)
private void resetsortview()
{
trvsort.nodes.clear();
arrnode.clear();
exnode nd = new exnode();
//
// 添加商品總類
//
sort mysort = new sort();
mysort.id = 0;
mysort.name = "商品總類";
mysort.parentid = -1;
mysort.isend =false;
mysort.disable = false;
nd.sort = mysort;
nd.imageindex = 0;
nd.selectedimageindex = 0;
trvsort.nodes.add(nd);
arrnode.add(nd);
// 打開數(shù)據(jù)庫
// 不好意思,我把數(shù)據(jù)庫打開都定義類了,全包裝在dbclass內(nèi)
// 這樣換成sql server就省力些
// dataset這里也封裝,為mydb.dbdataset
// 懶得定數(shù)據(jù)庫了,如果不熟悉數(shù)據(jù)庫,快學(xué)習(xí)一下
string sql = "select * from merchandisesort order by merchandisesortid";
dbclass mydb = new dbclass();
mydb.dbopen();
mydb.createadapter(sql);
mydb.filldataset();
//
// 把數(shù)據(jù)記錄逐一添加到樹開上去
// 錯(cuò)誤從這里開始
// --------------------------------------------------------------------------------------
for (int i = 1; i <= mydb.dbdataset.tables[0].rows.count; i++)
{
mysort.id = (int)mydb.dbdataset.tables[0].rows[i-1]["merchandisesortid"];
mysort.name = mydb.dbdataset.tables[0].rows[i-1]["name"].tostring();
mysort.parentid = (int)mydb.dbdataset.tables[0].rows[i-1]["parentid"];
mysort.isend = (bool)mydb.dbdataset.tables[0].rows[i-1]["isend"];
mysort.disable = (bool)mydb.dbdataset.tables[0].rows[i-1]["disable"];
addnode(mysort);
}
// --------------------------------------------------------------------------------------
mydb.dbclose();
trvsort.expandall();
}
該代碼重寫,即向treeview中成功添加一后,從dataset口中刪去該節(jié)點(diǎn)記錄,并進(jìn)行新的一次循環(huán),否則dataset往下查找能添加的記錄。程序如下:
修正后的添加節(jié)點(diǎn)的子程序:
/// <summary>
/// 在treeview中增加node,并把node加入到數(shù)組,方便查詢
/// </summary>
private bool addnode(sort addsort)
{
bool added = false;
exnode parentnode = new exnode(); // 要掛接的父結(jié)點(diǎn)
exnode addnode = new exnode(); // 本結(jié)點(diǎn)
addnode.sort = addsort;
if (addnode.sort.parentid == 0)
{
trvsort.nodes[0].nodes.add(addnode);
// 使標(biāo)志設(shè)為找到
added = true;
arrnode.add(addnode);
addnode.idpath = "root//0";
}
else
{
foreach ( exnode pnode in arrnode )
{
if ( pnode.sort.id == addsort.parentid)
{
parentnode = pnode;
parentnode.nodes.add(addnode);
arrnode.add(addnode);
addnode.idpath = parentnode.idpath + "//" + addnode.sort.parentid.tostring();
// 使標(biāo)志設(shè)為找到
added = true;
break;
}
}
}
// 如果沒有找到,返回false
if ( !added ) return false;
if (addsort.isend)
{
if (addsort.disable)
{
addnode.imageindex = 4;
addnode.selectedimageindex = 4;
addnode.forecolor = systemcolors.graytext;
}
else
{
addnode.imageindex = 2;
addnode.selectedimageindex = 2;
addnode.forecolor = systemcolors.windowtext;
}
}
else
{
if (addsort.disable)
{
addnode.imageindex = 3;
addnode.selectedimageindex = 3;
addnode.forecolor = systemcolors.graytext;
}
else
{
addnode.imageindex = 1;
addnode.selectedimageindex = 1;
addnode.forecolor = systemcolors.windowtext;
}
}
return true;
}
修正后的顯示分類樹程序:
/// <summary>
/// 重設(shè)商品分類的 treeview
/// </summary>
public void resetsortview()
{
trvsort.nodes.clear();
arrnode.clear();
exnode nd = new exnode();
//
// 添加商品總類
//
sort mysort = new sort();
mysort.id = 0;
mysort.name = "商品總類";
mysort.parentid = -1;
mysort.isend =false;
mysort.disable = false;
nd.sort = mysort;
nd.imageindex = 0;
nd.selectedimageindex = 0;
trvsort.nodes.add(nd);
arrnode.add(nd);
nd.idpath = "root";
string sql = "select * from merchandisesort order by merchandisesortid asc";
dbclass mydb = new dbclass();
mydb.dbopen();
mydb.createadapter(sql);
mydb.filldataset();
//
// 以下修正后代碼,用二重循環(huán),真到dataset中的記錄全部添加為止
//
while ( mydb.dbdataset.tables[0].rows.count > 0 )
{
for (int i = 1; i <= mydb.dbdataset.tables[0].rows.count; i++)
{
mysort.id = (int)mydb.dbdataset.tables[0].rows[i-1]["merchandisesortid"];
mysort.name = mydb.dbdataset.tables[0].rows[i-1]["sortname"].tostring();
mysort.parentid = (int)mydb.dbdataset.tables[0].rows[i-1]["parentid"];
mysort.isend = (bool)mydb.dbdataset.tables[0].rows[i-1]["isend"];
mysort.disable = (bool)mydb.dbdataset.tables[0].rows[i-1]["disable"];
// 如果添加成功,岀刪除dataset中相應(yīng)記錄,并進(jìn)入新的循環(huán)
if ( addnode(mysort) )
{
mydb.dbdataset.tables[0].rows.removeat(i - 1);
mydb.dbdataset.tables[0].acceptchanges();
break;
}
}
}
mydb.dbclose();
trvsort.collapseall();
trvsort.nodes[0].expand();
}