《用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();
 }