Esempio n. 1
0
        public IList <TreeModel> GetDisplayTreeNode(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return(null);
            }
            string[]        keys          = key.Split(',');
            var             allTreeModels = GetAllTree().ToList();
            KeyNode         keyNode;
            IList <KeyNode> keyNodes = new List <KeyNode>();

            //找出非根节点下的最深路径
            foreach (var id in keys)
            {
                keyNode = new KeyNode {
                    Deep = 0, ID = id
                };
                var deepestTreeModel = allTreeModels.FirstOrDefault(m => m.ID == id);
                if (deepestTreeModel != null && deepestTreeModel.ParentID != "0")
                {
                    FillDeepestData(deepestTreeModel, keyNode, allTreeModels);
                    keyNodes.Add(keyNode);
                }
            }
            var resultKeyNodes = from kn in keyNodes
                                 group kn by kn.RootID into g
                                 select g.FirstOrDefault(p => p.Deep == g.Max(n => n.Deep));

            var resultTreeModes = new List <TreeModel>();

            foreach (var resultKeyNode in resultKeyNodes)
            {
                //填充从根节点到最深层之间的数据

                FillFromRootToDeepestData(resultKeyNode.RootID, resultKeyNode.Deep, resultTreeModes, allTreeModels);

                //填充最深层的兄弟数据和自身
                var currentTreeModel = allTreeModels.FirstOrDefault(m => m.ID == resultKeyNode.ID);
                if (currentTreeModel.ParentID != "0")
                {
                    resultTreeModes.AddRange(allTreeModels.FindAll(m => m.ParentID == currentTreeModel.ParentID));
                }
            }
            // 填充从根节点数据
            foreach (var rootTreeModel in allTreeModels)
            {
                if (rootTreeModel.ParentID == "0")
                {
                    resultTreeModes.Add(rootTreeModel);
                }
            }
            foreach (var resultTreeModel in resultTreeModes)
            {
                if (key.Contains(resultTreeModel.ID))
                {
                    resultTreeModel.IsSelected = true;
                }
            }
            return(resultTreeModes);
        }
Esempio n. 2
0
        private void FillDeepestData(TreeModel treeModel, KeyNode keyNode, IList <TreeModel> treeModels)
        {
            var preTreeModel = treeModels.FirstOrDefault(m => m.ID == treeModel.ParentID && m.ID != m.ParentID);

            //防止死循环
            if (preTreeModel != null)
            {
                if (preTreeModel.ParentID == "0")
                {
                    keyNode.RootID = preTreeModel.ID;
                }
                else
                {
                    keyNode.Deep++;
                    FillDeepestData(preTreeModel, keyNode, treeModels);
                }
            }
        }