树形递归处理示例代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace SilverlightApplication4
{
    public partial class Test1 : UserControl
    {
        public Test1()
        {
            InitializeComponent();
            List<Data> listData = GetListData();
            BuildTree("-1", listData, null);
        }

        private List<Data> GetListData()
        {
            return new List<Data>  //首先数据源必须是树状结构的,然后程序在实现将树状结构的数据组织到一起
            {
                //根节点(一级节点)
                new Data{PK ="0000",Name ="供热节能项目", Last="-1"},

                //二级节点
                new Data{PK ="00A0",Name ="供热一厂", Last="0000"},
                //三级级节点
                new Data{PK = "00A1",Name="热源A",Last = "00A0"},
                new Data{PK = "00A2",Name="热源B",Last = "00A0"},
                new Data{PK = "00A3",Name="热源C",Last = "00A0"},

                //二级节点
                new Data{PK ="00B0",Name ="供热二厂", Last="0000"},
                //三级级节点
                new Data{PK = "00B1",Name="热源X",Last = "00B0"},
                new Data{PK = "00B2",Name="热源Y",Last = "00B0"},

                //二级节点
                new Data{PK ="00C0",Name ="供热三厂", Last="0000"},
                //三级级节点
                new Data{PK = "00C1",Name="热源M",Last = "00C0"},
                new Data{PK = "00C2",Name="热源N",Last = "00C0"},
                new Data{PK = "00Cx",Name="热源Nx",Last = "00C2"},

                new Data{PK = "00C3",Name="热源K",Last = "00C0"}
            };
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="strLast">要挂节点的上级或父节点的主键(注:根节点的上级不存在,故其值为-1)</param>
        /// <param name="listData">过滤指定上级(Last值)的数据源</param>
        /// <param name="tv">要挂节点的父节点(注:根节点的父节点不存在,故其值为null)</param>
        private void BuildTree(string strLast, List<Data> listData,TreeViewItem tv)
        {
            List<Data> list = listData.Where<Data>(item => item.Last == strLast).ToList<Data>();//listData主要参与指定上级数据的过滤
            if (list.Count > 0)
            {
                foreach (var item in list)
                {
                    TreeViewItem treeNode = new TreeViewItem();
                    treeNode.Tag = item.PK;
                    treeNode.Header = item.Name;
                    if (strLast == "-1")//根节点挂到treeView1上
                    {
                        treeView1.Items.Add(treeNode);
                    }
                    else//其它节点挂到其所属的父节点上
                    {
                        tv.Items.Add(treeNode);
                    }
                    BuildTree(treeNode.Tag.ToString(), listData, treeNode);
                }
            }
        }

        //全部展开
        private void SetPositon1(string strPK, ItemCollection items)
        {
            foreach (TreeViewItem item in items)
            {
                item.IsExpanded = true;
                if (item.Tag.ToString() == strPK)
                {
                    item.IsSelected = true;
                    break;
                }
                else
                {
                    if (item.Items.Count > 0)
                    {
                        SetPositon1(strPK, item.Items);
                    }
                }
            }
        }


        //部分展开
        private void SetPositon2(string strPK, ItemCollection items)
        {
            foreach (TreeViewItem item in items)
            {
                if (item.Tag.ToString() == strPK)
                {
                    //选中匹配项
                    item.IsSelected = true;
                    //找到后,往回展开
                    BackExpanded(item);
                    break;
                }
                else
                {
                    if (item.Items.Count > 0)
                    {
                        SetPositon2(strPK, item.Items);
                    }
                }
            }
        }


        private void BackExpanded(TreeViewItem item)
        {
            if (item.Parent.GetType() == typeof(TreeViewItem))//说明是根节点
            {
                (item.Parent as TreeViewItem).IsExpanded = true;
                BackExpanded(item.Parent as TreeViewItem);
            }
        }


        private void button1_Click(object sender, RoutedEventArgs e)
        {
            SetPositon2("00Cx", treeView1.Items);
        }


    }


    class Data
    {
        public string PK { get; set; }
        public string Name { get; set; }
        public string Last { get; set; }
    }
}

原文地址:https://www.cnblogs.com/changbaishan/p/3210574.html