前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >树TreeView控件与DataTable交互添加节点(最高效的方法)

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

作者头像
跟着阿笨一起玩NET
发布2018-09-18 13:46:07
1.5K0
发布2018-09-18 13:46:07
举报

方法一:

代码语言:javascript
复制
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 的 代码

代码语言:javascript
复制
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 上面

代码语言:javascript
复制
 /// <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);
                }
            }
          

调用的方法很简单

代码语言:javascript
复制
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

代码语言:javascript
复制
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));
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-04-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档