《用C#和数据库实现无限级分类法》修正程序
2024-07-21 02:19:00
供稿:网友
上次写了这篇文章后,马上发觉有个错误,即可能存在node漏加的情况。因在添加节点时,只有一个循环,当添加节点时,可能父节点还没有添加,即找不到父亲了,这就引起漏加。
真对不起,没有慎重。不过俺平常就是很随便的,一件事没想成熟就去做,但发现错了,一定会订正的。如果你不喜欢我这样,就把文章扔在一边吧。
原来程序:
/// <summary>
/// 重设商品分类的 treeview
/// resetsortview() 函数
/// </summary>
#region resetsortview()函数实现
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);
// 打开数据库
// 不好意思,我把数据库打开都定义类了,全包装在dbclass内
// 这样换成sql server就省力些
// dataset这里也封装,为mydb.dbdataset
// 懒得定数据库了,如果不熟悉数据库,快学习一下
string sql = "select * from merchandisesort order by merchandisesortid";
dbclass mydb = new dbclass();
mydb.dbopen();
mydb.createadapter(sql);
mydb.filldataset();
//
// 把数据记录逐一添加到树开上去
// 错误从这里开始
// --------------------------------------------------------------------------------------
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口中删去该节点记录,并进行新的一次循环,否则dataset往下查找能添加的记录。程序如下:
修正后的添加节点的子程序:
/// <summary>
/// 在treeview中增加node,并把node加入到数组,方便查询
/// </summary>
private bool addnode(sort addsort)
{
bool added = false;
exnode parentnode = new exnode(); // 要挂接的父结点
exnode addnode = new exnode(); // 本结点
addnode.sort = addsort;
if (addnode.sort.parentid == 0)
{
trvsort.nodes[0].nodes.add(addnode);
// 使标志设为找到
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();
// 使标志设为找到
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>
/// 重设商品分类的 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();
//
// 以下修正后代码,用二重循环,真到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中相应记录,并进入新的循环
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();
}