树TreeView控件与DataTable交互添加节点(最高效的方法)

方法一:

View Code

本文转载:http://dengzebo.blog.163.com/blog/static/18867406201032141742168/

#region "读取树结点从Datatable"

        /// <summary>

        /// 读取树结点从Datatable"

        /// </summary>

        /// <param name="TreeView1">在填充的TreeView控件</param>

        /// <param name="DT">数据源DataTable</param>

        /// <param name="IsAppendNode">是在现有TreeView控件上添加结点,还是清空再添加</param>

        /// <param name="ParentNumberColumnIndex">在DataTable中,代表父节点编号的列索引</param>

        /// <param name="NumberColumnIndex">在DataTable中,代表当前节点编号的列索引</param>

        /// <param name="NameColumnIndex">在DataTable中,代表当前节点名称的列索引</param>

        /// <returns>True/False</returns>

        public bool ReadNodesFromDataTable(TreeView TreeView1, DataTable DT, bool IsAppendNode, int ParentNumberColumnIndex, int NumberColumnIndex, int NameColumnIndex)

        {

            try

            {

                if (IsAppendNode == false)

                {

                    TreeView1.Nodes.Clear();

                }

                if (DT != null && DT.Rows.Count > 0)

                {

                    DataRow[] DR = null;

                    DR = DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName + "='' or " + DT.Columns[ParentNumberColumnIndex].ColumnName + "='0' or " + DT.Columns[ParentNumberColumnIndex].ColumnName + " is null");//先将顶级的查出来
                    for (int I = 0; I <= DR.Length - 1; I++)//先将顶级的加入到TreeView中
                    {

                        TreeNode TNode = new TreeNode(DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString());

                        TNode.Tag = DR[I][DT.Columns[NumberColumnIndex].ColumnName].ToString();

                        TNode.Name = DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString();

                        TreeView1.Nodes.Add(TNode);

                    }

                    for (int I = 0; I <= TreeView1.Nodes.Count - 1; I++)//再递归遍历结点
                    {

                        ForTreeNodeFormDT(TreeView1.Nodes[I], DT, ParentNumberColumnIndex, NumberColumnIndex, NameColumnIndex);

                    }

                }

                return false;

            }

            catch

            {

                return true;

            }

        }

 

        /// <summary>

        /// 从DT中递归遍历出结点
        /// </summary>

        /// <param name="TempNode">传入的顶级结点</param>

        /// <param name="DT">保存TreeView结构的DataTable</param>

        /// <param name="ParentNumberColumnIndex">在DataTable中,代表父节点编号的列索引</param>

        /// <param name="NumberColumnIndex">在DataTable中,代表当前节点编号的列索引</param>

        /// <param name="NameColumnIndex">在DataTable中,代表当前节点名称的列索引</param>

        private void ForTreeNodeFormDT(TreeNode TempNode, DataTable DT, int ParentNumberColumnIndex, int NumberColumnIndex, int NameColumnIndex)

        {

            string TTag = null;

            TTag = TempNode.Tag.ToString();

            DataRow[] DR = null;

            DR = DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName + "='" + TTag + "'");

 

            for (int I = 0; I <= DR.Length - 1; I++)

            {

                TreeNode TNode = new TreeNode(DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString());

                TNode.Tag = DR[I][DT.Columns[NumberColumnIndex].ColumnName].ToString();

                TNode.Name = DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString();

                TempNode.Nodes.Add(TNode);

            }

 

            foreach (TreeNode aNode in TempNode.Nodes)

            {

                ForTreeNodeFormDT(aNode, DT, ParentNumberColumnIndex, NumberColumnIndex, NameColumnIndex);

            }

        }

        #endregion

 

 

方法二:

 

做分类 经常会用到无限级别的分类  先介绍一下数据库的表结构

tid  类别编号

tname 类别名称

pid 父类编号

测试数据就不写了,大家可以自己插入一下试试

查询制定类别的 所有的子类   sql 的 代码

with as 递归查询

alter proc  proc_chaxun
(@tid int )
as
begin  

    with tt  as
    (

        select tid,tname,pid from dbo.t_goodsType where tid=@tid
        union all
        select t.tid,t.tname,t.pid from dbo.t_goodsType  t inner join tt
        on t.pid=tt.tid
    )
    select * from tt
end 

查询之后获取记录集   绑定到前台的 TreeView 上面

递归进行添加

 /// <summary>
            /// 给Tree 绑定数据 递归添加子节点
            /// </summary>
            /// <param name="dv">数据视图</param>
            /// <param name="tnOld">添加数据的节点</param>
            public void TreeDataBind(DataView dv,TreeNode tnOld)
            {
                TreeNode tnNew;    //创建一个新的节点
                foreach (DataRowView drv in dv)
                {
                    //为新的借点设置属性
                    tnNew = tnOld.Nodes.Add(drv["tname"].ToString());
                    tnNew.Tag = drv["tid"];
                    //过滤数据视图 父类id = 上一级的tid
                    dv.RowFilter = "pid=" + drv["tid"].ToString();
                    //自己调用自己
                    TreeDataBind(dv, tnNew);
                }
            }
          

调用的方法很简单

调用

DataTable dtRet = (DataTable)dh.ExecProcRetObj(ep);
DataView dv = new DataView(dtRet);
 dv.RowFilter = "pid=0";
TreeDataBind(dv, this.treeView1.Nodes.Add("商品类别"));

效果

 

[知识分享] LINQ TO SQL 实现无限递归查询

本文转载:http://blog.csdn.net/q107770540/article/details/7708418

List<DetptInfo> lstDept = new List<DetptInfo>
{
new DetptInfo {ID=1,DeptName="公司",ParentID=0},
new DetptInfo {ID=10,DeptName="软件中心",ParentID=1},
new DetptInfo {ID=11,DeptName="综合办公室",ParentID=1},
new DetptInfo {ID=100,DeptName="人力资源部",ParentID=11},
new DetptInfo {ID=101,DeptName="行政部",ParentID=11},
};

public static List<DetptInfo> GetSonID(List<DetptInfo> lstDept, int p_id)
{
var query = from c in lstDept
where c.ParentID == p_id
select c;

return query.Concat(query.SelectMany(t => GetSonID(lstDept, t.ID))).ToList();
}

--调用:

var query = GetSonID(lstDept, 0);
Console.WriteLine("Id\tName\tParent");

query.ToList().ForEach(q => Console.WriteLine("{0}\t{1}\t{2}", q.ID, q.DeptName, q.ParentID));

  

时间: 2024-10-22 07:40:56

树TreeView控件与DataTable交互添加节点(最高效的方法)的相关文章

PB的treeview 控件怎么得到选中checkbox节点的值 急啊!求解答

问题描述 PB的treeview 控件怎么得到选中checkbox节点的值 急啊!求解答 解决方案 treeview 节点循环 得到 被选中的checkbox 值

如何使用 .net 的TreeView控件

treeview|控件     ASP.NET真正有用的特性就是其可扩充性.世界各地的开发人员都可以创建自己的自定义控件,这种自定义控件可以方便地在你自己的过程中进行定义.其中,Internet Explorer Web Controls就是由微软公司在标准的ASP.NET控件之外创建的这样一个集合. WINDOWS资源管理器中的驱动器和其下的文件及文件夹就是按照一种层次结构来安排的,在这个控件集中有一个treeview控件为我们提供了一种按层次结构显示信息的方式.treeview控件包含了称做

在.NET开发中灵活使用TreeView控件

treeview|控件 ASP.NET真正有用的特性就是其可扩充性.世界各地的开发人员都可以创建自己的自定义控件,这种自定义控件可以方便地在你自己的过程中进行定义.其中,Internet Explorer Web Controls就是由微软公司在标准的ASP.NET控件之外创建的这样一个集合. Windows资源管理器中的驱动器和其下的文件及文件夹就是按照一种层次结构来安排的,在这个控件集中有一个treeview控件为我们提供了一种按层次结构显示信息的方式.treeview控件包含了称做"节点&

ASP.NET中TreeView控件使用小结

asp.net|treeview|控件 中国IT动力,最新最全的IT技术教程最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 未整理篇 | 技术讨论 ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql 服务器 Win2000

VC中实现带有背景位图的树型控件

当前许多应用程序都在使用树型控件时为其添加了背景位图,增强的控件的魅力,然而对于Visual C++编程爱好者来说,使用Visual C++MFC提供的树型控件(CTreeCtrl)本身就是一个难点,至于如何使该控件能够带有背景位图,那就更加是一个令人困惑的问题了.本实例对CTreeCtrl类进行了增强,不仅使它带有背景位图,而且解决了在点击树型控件时背景位图闪动的问题,另外,通过在对话框中使用该控件来显示三级目录,演示了树型控件的基本使用方法.下图为程序编译后的运行效果图: 图一.带背景图的树

在 ASP.NET 页面中使用 TreeView 控件

一.            下载源码 http://www.asp.net/IEWebControls/IEWebControls.exe   二.            安装及编译 1.执行安装文件后,在安装目录找到 "build.bat"文件,用记事本将其打开.把"csc.exe"换成绝对路径"C:/WINNT/Microsoft.NET/Framework/v1.1.4322/csc.exe".保存后执行(记得把"只读"

ASP.NET实现静态的TreeView控件导航

ASP.NET提供了一系列拥有页面导航功能的控件,这些控件包括在页面显示菜单的Menu控件.提供站点导航的Site MapPath控件和显示层次结构的树形(TreeView)控件.本章的示例将介绍这些控件在创建Web应用程序中的应用. 实现静态的TreeView控件导航 TreeView控件是一个树形结构的控件.该控件用于显示分层数据,如文件目录.TreeView控件的每个节点是一个TreeNode对象,具有Text属性和Value属性,Text属性指定在节点显示的文字,Value属性是获取节点

TreeView控件的双击事件

treeview|控件 本例实现双击节点,弹出对话框并显示节点信息 先对treeview1加入些数据,代码如下: Sub Example() Dim N As New TreeNode, I As Integer, J As Integer For I = 0 To 3 With N.Nodes.Add((I * 15).ToString & "-" & ((I + 1) * 15 - 1).ToString) For J = 0 To 14 .Nodes.Add((J

如何使TreeView导航控件在选中节点跳转到对应页面时不刷新TreeView控件?求解...

问题描述 在一个页面中有一个TreeView控件,当选中对应的节点时根据路径跳转到对应的页面,这样在跳转页面的同时TreeView控件也存在刷新的过程,请大家各位帮帮忙. 解决方案 解决方案二:使用局部刷新,updatepannel,将TreeView控件放到里面解决方案三:一个变态的方法,慎用!包含Treeview控件的部分用一个iframe替换,同时此iframesrc="ChannelTree.aspx"<iframeid="TreeView"frame