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

摘要:
方法1:ViewCode本文转载:http://dengzebo.blog.163.com/blog/static/18867406201032141742168/#region“从数据表读取树节点”/////从数据表中读取树节点////正在填充的TreeView控件//

方法一:

View Code
本文转载:http://dengzebo.blog.163.com/blog/static/18867406201032141742168/
#region"读取树结点从Datatable"
///<summary>///读取树结点从Datatable"
///</summary>///<paramname="TreeView1">在填充的TreeView控件</param>///<paramname="DT">数据源DataTable</param>///<paramname="IsAppendNode">是在现有TreeView控件上添加结点,还是清空再添加</param>///<paramname="ParentNumberColumnIndex">在DataTable中,代表父节点编号的列索引</param>///<paramname="NumberColumnIndex">在DataTable中,代表当前节点编号的列索引</param>///<paramname="NameColumnIndex">在DataTable中,代表当前节点名称的列索引</param>///<returns>True/False</returns>
publicboolReadNodesFromDataTable(TreeViewTreeView1,DataTableDT,boolIsAppendNode,intParentNumberColumnIndex,intNumberColumnIndex,intNameColumnIndex)
{
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+"isnull");//先将顶级的查出来for(intI=0;I<=DR.Length-1;I++)//先将顶级的加入到TreeView中{
TreeNodeTNode=newTreeNode(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(intI=0;I<=TreeView1.Nodes.Count-1;I++)//再递归遍历结点{
ForTreeNodeFormDT(TreeView1.Nodes[I],DT,ParentNumberColumnIndex,NumberColumnIndex,NameColumnIndex);
}
}
returnfalse;
}
catch
{
returntrue;
}
}
///<summary>///从DT中递归遍历出结点
///</summary>///<paramname="TempNode">传入的顶级结点</param>///<paramname="DT">保存TreeView结构的DataTable</param>///<paramname="ParentNumberColumnIndex">在DataTable中,代表父节点编号的列索引</param>///<paramname="NumberColumnIndex">在DataTable中,代表当前节点编号的列索引</param>///<paramname="NameColumnIndex">在DataTable中,代表当前节点名称的列索引</param>
privatevoidForTreeNodeFormDT(TreeNodeTempNode,DataTableDT,intParentNumberColumnIndex,intNumberColumnIndex,intNameColumnIndex)
{
stringTTag=null;
TTag=TempNode.Tag.ToString();
DataRow[]DR=null;
DR=DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName+"='"+TTag+"'");
for(intI=0;I<=DR.Length-1;I++)
{
TreeNodeTNode=newTreeNode(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(TreeNodeaNodeinTempNode.Nodes)
{
ForTreeNodeFormDT(aNode,DT,ParentNumberColumnIndex,NumberColumnIndex,NameColumnIndex);
}
}
#endregion

方法二:

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

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

tid 类别编号

tname 类别名称

pid 父类编号

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

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

with as 递归查询
复制代码
alter procproc_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 jointt
        on t.pid=tt.tid
    )
    select * fromtt
end 
复制代码

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

递归进行添加
复制代码
 /// <summary>
            ///给Tree 绑定数据 递归添加子节点
            /// </summary>
            /// <param name="dv">数据视图</param>
            /// <param name="tnOld">添加数据的节点</param>
            public voidTreeDataBind(DataView dv,TreeNode tnOld)
            {
                TreeNode tnNew;    //创建一个新的节点
                foreach (DataRowView drv indv)
                {
                    //为新的借点设置属性 
                    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 = newDataView(dtRet);
 dv.RowFilter = "pid=0";
TreeDataBind(dv, this.treeView1.Nodes.Add("商品类别"));

效果

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

[知识分享] 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));

免责声明:文章转载自《树TreeView控件与DataTable交互添加节点(最高效的方法)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CentOS7安装python3.8.5Bootstrap 点击按钮切换内容下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

通过键盘方向键控制TreeView节点的移动

本文转载:http://dengzebo.blog.163.com/blog/static/18867406201032141932204/ View Code #region"控制树节点移动,向左右下上"///<summary>///通过Ctrl+键盘移动选定的树节点///</summary>///<paramname=...

WPF笔记(3)TreeView

TreeView表示的是层次化结构(hierarchical)数据。TreeView的每一项称为TreeViewItem。TreeViewItem既可以被定义成一个字符串,也可以是一个嵌套的Item对象集合。TreeView的类层次结构如下: ControlItemsControlHeaderedItemsControlMenuItemToolBarTre...

获取TreeView 树中所选择的值

利用一个递归函数将TreeView中所选择的值 Add到一个List<String> 中 public static void GetTreeViewSelectItems(TreeView tree) { //リスト無効の場合 if (treeValLst == null) { //初始化 treeValLst = new List<s...

C#实现树型结构TreeView节点拖拽的简单功能(转)

本文摘抄博客园里面的牛人吉日嘎啦。http://www.cnblogs.com/jirigala 例子程序运行效果如何下:   当然在节点拖拽时,需要注意几个事情: 1:拖拽时总需要有提示信息比较好,防止误操作后找不到被托摘到哪里去了。 2:父亲节点总不能拖拽到自己的子节点上,那不是死循环或者乱了辈份了不是? 为了让TreeView支持拖拽功能,需要注意...

[WPF](小结4)TreeView的数据分层模板

前边研究的是某控件嵌套某控件,这里相当于树嵌套树,但这里不能这么叫,树很特殊,它有一个分层数据模板:HierarchicalDataTemplate,现在来看如何使用, 第一:选构建题目类,再建一个选项类,题目类集合中的每个项包含一个选项类集合,即数组嵌套数组,C#语句如下: (为方便看清语句,类直接写在主程序中) C#代码如下:usingSyste...

winform如何保持TreeView节点展开和折叠的状态

转载:http://blog.sina.com.cn/s/blog_6abcacf5010138q5.html private Hashtable NodesStatus = new Hashtable(); private string SelectNodeFullPath = string.Empty; ///...