您的位置:首页 > 编程语言

树形递归处理示例代码

2013-07-24 14:22 225 查看
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; }
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: