首页 > 非递归一次性加载分类数据到TreeViw

非递归一次性加载分类数据到TreeViw

 

  不是经常用,发现再次用到时又要再写一遍,这次花点时间记录一下

  代码:

-------------------------------------

 private void InitView()

    {

        DataView dv = CommodityClassBLL.Query().Tables[0].DefaultView;

  

            if (dv.Count >= 1)

            {

                dv.Sort = "Code";

                string curCode = "";

                string prvCode = dv[0]["code"].ToString();

                trvClass.Nodes.Clear();

                trvClass.Nodes.Add(new TreeNode("行业分类", "0"));

                trvClass.Nodes[0].SelectAction = TreeNodeSelectAction.None;

               

                TreeNode root = new TreeNode(dv[0]["ClassName"].ToString(), dv[0]["ClassID"].ToString());

                trvClass.Nodes[0].ChildNodes.Add(root);

                root.NavigateUrl = string.Format(JsText, dv[0]["ClassName"].ToString(), dv[0]["ClassID"].ToString(), root.ValuePath);

                TreeNode prvNode = trvClass.Nodes[0].ChildNodes[0];//定位prvNode为第一个实际数据节点

                //prvNode用来寻找当前节点的父节点


                for (int i = 1; i < dv.Count; i++)

                {

                    curCode = dv[i]["Code"].ToString();

                    int classID = (int)dv[i]["ClassID"];

                    string className = dv[i]["ClassName"].ToString();

                    int len = curCode.Length - prvCode.Length;

                    if (len > 4)//表示当前节点是prvNode节点子节点的子节点

                    {

                       //那么prvNode.ChildNodes[prvNode.ChildNodes.Count-1]

                       //即是当前接点的父节点

                        prvNode = prvNode.ChildNodes[prvNode.ChildNodes.Count - 1];

                        prvCode = curCode.Substring(0, curCode.Length - 4);

                    }

                    else if (len < 4)//表示当前节点的父节点是prvNode向上的某个父节点

                    {

                        int level = Math.Abs(len / 4) + 1;

                        for (int j = 1; j <= level; j++)

                        {

                            prvNode = prvNode.Parent;//回溯

                        }

                        prvCode = curCode.Substring(0, curCode.Length - 4);

                    }

                    //(len==4)表示当前节点是前一节点的的直接子节点(参考下面的截图)

                    TreeNode node = new TreeNode(className, classID.ToString());

                    prvNode.ChildNodes.Add(node);

                   

                    node.NavigateUrl = string.Format(JsText, className, classID, node.ValuePath);

                   //标记选中的接点,并展开其父节点

                    if (classID == SelectedClassID)

                    {

                        node.Selected = true;

                        while (node.Parent != null)

                        {

                            node.Parent.Expand();

                            node = node.Parent;

                        }

 

                    }

                }

                if (trvClass.Nodes[0].ChildNodes != null)

                    trvClass.Nodes[0].Expand();

            }

   

    }

 -------------------------------

说明:

  dv里面的数据结构如

 

 

 

转载于:https://www.cnblogs.com/wdfrog/archive/2008/09/26/1299549.html

更多相关:

  • 当一个IT组织开始走到需要实施网络边缘的旅程时,他们很快意识到面对的挑战与他们在传统数据中心内所经历的挑战不同。 第一个挑战是空间。与更大的核心或区域数据中心同类产品相比,许多边缘站点的物理尺寸更小,因此,需要仔细计划好,尝试在未为其专门设计的空间中安装硬件。  第二个挑战是运行环境。还必须解决的可能面对的冷热温度变化 ,天气,无...

  • 单向循环链表单链表的一个变形是单向循环链表, 链表的最后一个节点的next域不再为None, 而是指向链表的头节点.单向循环链表如图所示:单向循环链表同样单向循环链表也是要使用python来对它的基本功能进行一个封装. 总体大致的功能如下:is_empty() 判断链表是否为空length() 返回链表的长度travel() 遍历ad...

  • 题目: 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一...

  • 题目:删除链表的节点 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 注意:此题对比原题有改动 示例 1: 输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为...

  • 【从零开始的ROS四轴机械臂控制】(一)- 实际模型制作、Solidworks文件转urdf与rviz仿真 一、模型制作 1.实际模型制作 2.Solidworks模型制作 二、Solidworks文件转urdf 1.sw_urdf_exporter插件 2.添加坐标系和转轴 3.导出urdf文件 三、rivz仿真...