博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF中TreeView控件实现动态加载节点
阅读量:4954 次
发布时间:2019-06-12

本文共 2768 字,大约阅读时间需要 9 分钟。

WPF中TreeView控件实现动态加载节点

作者:马路灯 出处:博客园  2011/6/30 14:19:51 阅读 541  次

  最近项目需要,使用一个树型控件,其实数据量不大,简单使用一次递归就可以完事,但话说回来,想想,当数据量达到一个量级时,这个方法明显就不足(程序运行十分不给力),而使用节点的深度特性实现加载控制,达到动态生成节点项的目的,这不失为一个好方法。

 (全球首款甘特图32年历史)  (完美的用户界面解决方案)
 (报表生成控件)  (慧都独家)

  先来看看本实例的完成图(此处只实现其中动态加载功能,其实后续再补上):

  技术点:

  数据库结构:

  其中Depth为节点深度

  核心类TreeViewHelper代码(代码写得没水平请不要见笑,呵呵):

        public static void CreatTreeView(TreeView _myTreeView,

 myEx_TreeViewItem _parentNode, DataTable dt, 

bool isRoot = true, bool isActivity = true, int Depth = 3)
{
string myFilterString = isRoot? "ParentID = 0":"
ParentID = " + _parentNode.ID.ToString();
if (isActivity)
{
#region 动态加载节点
if (Depth > 0)
{
foreach (DataRow row in dt.Select(myFilterString))
{
myEx_TreeViewItem item = new myEx_TreeViewItem();
item.ID = (int)row["ID"];
item.Depth = (int)row["Depth"];
item.ItemContent = row["NodeName"].ToString();
item.ParentID = (int)row["ParentID"];
item.ItemPath = row["NodePath"].ToString();
item.IconPath = row["IconPath"].ToString();
item.IsExpanded = false;
if (isRoot)
{
_myTreeView.Items.Clear();  //加载根节点前先清除Treeview控件项
item.IsExpanded = true;
_myTreeView.Items.Add(item); //新增根节点
}
else
{
item.IsExpanded = false;
_parentNode.Items.Add(item); //新增下级节点
}
CreatTreeView(_myTreeView, item, dt,false,true,Depth-1);                     }
}
#endregion
}
else
{
#region 递归生成树
foreach (DataRow row in dt.Select(myFilterString))
{
myEx_TreeViewItem item = new myEx_TreeViewItem();
item.ID = (int)row["ID"];
item.Depth = (int)row["Depth"];
item.ItemContent = row["NodeName"].ToString();
item.ParentID = (int)row["ParentID"];
item.ItemPath = row["NodePath"].ToString();
item.IconPath = row["IconPath"].ToString();
if (isRoot)
{
_myTreeView.Items.Clear();
item.IsExpanded = true;
_myTreeView.Items.Add(item); //新增根节点
}
else
{
item.IsExpanded = false;
_parentNode.Items.Add(item); //新增下级节点
}
CreatTreeView(_myTreeView, item, dt, false);
}
#endregion
}
}
public static void CreatTreeViewItemChild
(TreeView _myTreeView, myEx_TreeViewItem _SelectedParentItem, 
DataTable dt, int Depth = 2)
{
_SelectedParentItem.Items.Clear();
if (Depth > 0)  //判断加载的深度,默认只加载两级
{
//设定过滤条件
string myFilterString;
myFilterString = "ParentID = " + _SelectedParentItem.ID.ToString();
foreach (DataRow row in dt.Select(myFilterString))
{
myEx_TreeViewItem item = new myEx_TreeViewItem();
item.ID = (int)row["ID"];
item.Depth = (int)row["Depth"];
item.ItemContent = row["NodeName"].ToString();
item.ParentID = (int)row["ParentID"];
item.ItemPath = row["NodePath"].ToString();
item.IconPath = row["IconPath"].ToString();
item.IsExpanded = false;
_SelectedParentItem.Items.Add(item); //新增下级节点
CreatTreeViewItemChild(_myTreeView, item, dt, (Depth - 1));
}
}
}

  有不足之处请指点,代码整理后再分享给大下,以下是程序的Demo,可看看实际效果,需要net4.0版本运行环境

转载于:https://www.cnblogs.com/hdxhan/archive/2012/02/17/2355643.html

你可能感兴趣的文章
Mac xcode 配置OpenGL
查看>>
利用sed把一行的文本文件改成每句一行
查看>>
使用Asyncio的Coroutine来实现一个有限状态机
查看>>
Android应用开发:核心技术解析与最佳实践pdf
查看>>
python——爬虫
查看>>
2.2 标识符
查看>>
孤荷凌寒自学python第五天初识python的列表
查看>>
孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库
查看>>
求一个字符串中最长回文子串的长度(承接上一个题目)
查看>>
简单权限管理系统原理浅析
查看>>
springIOC第一个课堂案例的实现
查看>>
求输入成绩的平均分
查看>>
ORACLE 数据库概述
查看>>
php PDO (转载)
查看>>
保险折扣统计
查看>>
贝叶斯
查看>>
wordpress自动截取文章摘要代码
查看>>
[置顶] 一名优秀的程序设计师是如何管理知识的?
查看>>
关于使用“状态模式”做工作流概要。
查看>>
谈谈:程序集加载和反射
查看>>