最近做了一点小东西 ,用到了递归在TreeView中加node 觉得很好用 写一点心得与大家分享
刚一说到递归 可能大家会很头疼,因为大家觉得他可能很神秘,不好弄.但是只要你明白了其中的原理,递归还是有它好用之处的,对于有规律的数据,递归可以帮你搞定.而不用自己在费脑子在哪写很多代码/
说了半天递归到底是怎么回事呢.其实大白话自己套用自己的循环.首先递归要有入口.没有入口的循环是无法进行的.其次你的循环要能出来.不要无限循环下去.
下面就已我做的treeView中加节点 的例子来说明递归的方法
这样大家就会有形象的认识了
先来看看我的数据库的设计
主要用到的是 前三个字段
这里的代码我用的是强类型数据集 便于理解每个段的意思
private void Init()
{
Xs_Areaset = new DALXs_Areaset();
dsSelect = Xs_Areaset.FindDsXs_AreasetByCode("-1");//先找到一个最上面的节点,也就是给个入口
//foreach (dsXs_Areaset.Xs_AreasetRow Row in dsSelect.Xs_Areaset.Rows)
//{
// TreeNode node = new TreeNode(Row.AreaName.ToString());
// node.Tag = Row.AreaCode.ToString();
// trvAreare.Nodes.Add(node);
// ShowChildNode(node);
//}//用了两种 foreach 和for都行 推荐用foreach 两种发法的机制不一样 foreach安全 效率高
for (int i = 0; i < dsSelect.Xs_Areaset.Rows.Count; i++)
{
TreeNode node = new TreeNode(dsSelect.Xs_Areaset.Rows[i][1].ToString());
node.Tag = dsSelect.Xs_Areaset.Rows[i][0].ToString();
trvAreare.Nodes.Add(node);
ShowChildNode(node);
}
trvAreare.Nodes[0].Expand();//第一项展开
trvAreare.SelectedNode = trvAreare.Nodes[0];//默认选中第一项
}
/// <summary>
/// 显示子节点
/// </summary>
private void ShowChildNode(TreeNode node)//编写的递归的方法
{
//TreeNode node;
//node = this.trvAreare.SelectedNode;
//string ParentCode = trvAreare.SelectedNode.Tag.ToString();
//dsSelectChile = new dsXs_Areaset();
dsXs_Areaset dsSelectChile = new dsXs_Areaset();
//using (Xs_Areaset=new DALXs_Areaset())//强制垃圾回收 可以不用 也可以不懂
//{
dsSelectChile = Xs_Areaset.FindDsXs_AreasetByCode(node.Tag.ToString());
//}
//foreach (dsXs_Areaset.Xs_AreasetRow Row in dsSelectChile.Xs_Areaset.Rows)
//{
// TreeNode nd = new TreeNode(Row.AreaName.ToString());
// nd.Tag = Row.AreaCode.ToString();
// node.Nodes.Add(nd);
// ShowChildNode(nd);
//}
for (int i = 0; i < dsSelectChile.Xs_Areaset.Rows.Count; i++)//循环必须写对了 要能循环出来才行
{
dsXs_Areaset.Xs_AreasetRow Row = (dsXs_Areaset.Xs_AreasetRow)dsSelectChile.Xs_Areaset.Rows[i];
TreeNode nd = new TreeNode(Row.AreaName.ToString());
nd.Tag = Row.AreaCode.ToString();
node.Nodes.Add(nd);
ShowChildNode(nd);//自己套用自己 递归方法的体现
}
}
以上用了两种循环写的 都可以实现 ,但推荐 foreach 具体两种方法的机制有什么不一样 可以去网上看看
到此样式就结束了 是不是真正的代码没有多少 ,我这里的数据库是只有三级 的 哪怕你有十级 这个方法也自己给你搞定 不用你在费心了
顺便在说一下啊 所有的递归方法都可以用别的方法来替代 不是为了实现某些功能只能用递归的