c实现treeview动态显示树形结构aries524的专栏csdn博客
利用TreeView控件动态生成无限级树
【】刘继平 ,严俊杰 ,陈国慧,邢秦安,林万超 . 5 等效热降法 的数学理 论基础研究 【 . 安交通 大学学报, 19 ,, ( ) M】西 9 8 3 5 52
f】王芬 . 6 用等 效热降法对 回热系统进 行分析 计算 . 华北电力技术 。
19, ) 9 8( 8
【 7 】李茂忠 . 等效热 降法在滦河发 电厂 6 号机组上 的应用 . 华北 电力技
+
,
文章编号: 1 7 - 0 12 0 ) 2 0 9 ・ 2 1 1 4 (0 7 0 ・ 0 10 6
利用 T e Ve re iw控件 动态生成 无限级 树
王桃群 ,卢东方
( 江大 学 计算机科 学 学院 ,荆州 4 42) 长 303
摘要 :本文主要讲述如何根据数据库 中的数据,利用 .NE re iw控件 TTe Ve 动态地生成一个无 限级 的树 型菜单 .同时. 当单击该树 型菜单 的叶子节点 时 ,从数据库中获取该叶子 节点所对应的窗体名 .然后利用反射来实例化窗 体并显示该窗体.
术 , 19 ,1) 9 8( 1
4孽 县赫 陷 县蜘 瞌 目岛亡 嫡管 作简:大 (2 , ,东 人 业武大自 娄生 抽壬抽生抽 岔桂 拧£、 者介米 1- 汉 山 宁, 于 学 化 n 1 I 利 9, 族 济 毕 汉 动 8男 )
方 謇 不效 法 篙 蓥 虽 同 然 菩 茭 特 ,们 分计 ?兰; 力计 矗 互 , 主 苫 鍪 璧 璺 它 的析 算 ; 设 主 _ 但 得 结参 等 。 所 的 果考文献 的 o 相 完 i 革;麦; 主 :立 ’ 主 妇
关键词: C re i 无限级树 : 反射 # T e Ve w; 中图分类号: T 3 . 文献标识码 : B P1 1 1
C#→用TreeView实现树菜单
C#→⽤TreeView实现树菜单具体⽅法是:创建⼀个数据库,设计树图信息表S_Menu,包含NodeId、ParentId、NodeName、Address、Icon字段,其它字段根据实际业务⽽定,节点名称NodeName将在树型控件的节点上显⽰,NodeId字段保存节点的唯⼀标识号,ParentId表⽰当前节点的⽗节点号,标识号组成了⼀个“链表”,记录了树上节点的结构。
设计⼀个Web窗体其上放置TreeView控件,修改其属性Id为tvMenu。
数据结构如下:CREATE TABLE [dbo].[S_Menu] ([NodeId] [char] (6) COLLATE Chinese_PRC_CI_AS NULL ,[ParentId] [char] (6) COLLATE Chinese_PRC_CI_AS NULL ,[NodeName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[Address] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[Icon] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL) ON [PRIMARY]GO数据库如下:NodeId ParentId NodeName Address Icon100000 0 公共查询部 icon_document.gif100001 100000 ⼈民币⽇报查询 public/a1.aspx icon_settings.gif100002 100000 外币⽇报查询 public/a2.aspx icon_settings.gif100003 0 分⾏科技部 icon_document.gif100004 100003 ⼈民币⽇报查询 tech/a1.aspx icon_settings.gif100005 100003 外币⽇报查询 tech/a2.aspx icon_settings.gif100006 0 福⽥⽀⾏ icon_document.gif100007 100006 ⽉存款进度表 a1.aspx icon_settings.gif100008 100006 ⽉存款⾛势图 a2.aspx icon_settings.gif100009 0 罗湖⽀⾏ icon_document.gif100010 100009 ⽉存款进度表 a1.aspx icon_settings.gif100011 100009 ⽉存款⾛势图 a2.aspx icon_settings.gifmenu_left.aspx⽂件如下:<%@ Register TagPrefix="iewc" Namespace="Microsoft.Web.UI.WebControls" Assembly="Microsoft.Web.UI.WebControls, Version=1.0.2.226, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %><%@ Page language="c#" Codebehind="menu_Left.aspx.cs" AutoEventWireup="false" Inherits="hzquery.menu.menu_Left" %><HTML><HEAD><title>menu_Left</title><meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"><meta name="CODE_LANGUAGE" Content="C#"><meta name="vs_defaultClientScript" content="JavaScript"><meta name="vs_targetSchema" content=""></HEAD><body MS_POSITIONING="GridLayout"><form id="menu_Left" method="post" runat="server"><iewc:TreeView id="tvMenu" runat="server"></iewc:TreeView></form></body></HTML>CodeBehind代码如下:using System;using System.Collections;using ponentModel;using System.Data;using System.Drawing;using System.Web;using System.Web.SessionState;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.HtmlControls;using Microsoft.Web.UI.WebControls;using System.Data.SqlClient;namespace hzquery.menu{/// <summary>/// menu_Left 的摘要说明。
C实现树型结构TreeView节点拖拽的简单功能,附全部源码,供有需要的参考
应用软件是否好用就体现在一些细节操作上,开发人员是否考虑到了很多细节,例如一个树形结构的数据若不支持拖拽功能那用起来会很糟糕一些,用户体验也会不太爽,下面就以通用权限管理系统组件源码中的组织机构(部门)管理模块为例子,讲解一下树型结构TreeView节点拖拽的简单功能实现。
其实组织机构管理模块平时不怎么用到拖拽功能,但是往往在数据初始化时为了实现快速输入数据及进行整理调整数据时,往往就非常迫切需要一个灵活的组织机构管理器,当每到年底或者公司进行大的人事调整时也会遇到后台管理员迫切需要拖拽功能的需求,平时组织机构不会有大变动。
软件功能是否好用,往往是体现在最需要折腾数据时是否好用?养兵千日用兵一时,一般没经过磨难的新开发的软件往往会想得不够周到,关键时刻容易掉链子,经不起客户的折腾。
例子程序运行效果如何下:当然在节点拖拽时,需要注意几个事情:1:拖拽时总需要有提示信息比较好,防止误操作后找不到被托摘到哪里去了。
2:父亲节点总不能拖拽到自己的子节点上,那不是死循环或者乱了辈份了不是?为了让TreeView支持拖拽功能,需要注意以下几个属性设置及相应的事件代码。
代码实现参考如下:private void tvOrganize_ItemDrag(object sender, ItemDragEventArgs e){if (this.permissionEdit){// 开始进行拖放操作,并将拖放的效果设置成移动。
this.DoDragDrop(e.Item, DragDropEffects.Move);}}private void tvOrganize_DragEnter(object sender, DragEventArgs e){// 拖动效果设成移动e.Effect = DragDropEffects.Move;}private void tvOrganize_DragDrop(object sender, DragEventArgs e){// 定义一个中间变量TreeNode treeNode;//判断拖动的是否为TreeNode类型,不是的话不予处理if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false)){// 拖放的目标节点TreeNode targetTreeNode;// 获取当前光标所处的坐标// 定义一个位置点的变量,保存当前光标所处的坐标点Point point = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));// 根据坐标点取得处于坐标点位置的节点targetTreeNode = ((TreeView)sender).GetNodeAt(point);// 获取被拖动的节点treeNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");// 判断拖动的节点与目标节点是否是同一个,同一个不予处理if (BaseInterfaceLogic.TreeNodeCanMoveTo(treeNode, targetTreeNode)){if (BaseSystemInfo.ShowInformation){// 是否移动部门if (MessageBox.Show(AppMessage.Format(AppMessage.MSG0038, treeNode.Text, targetTreeNod e.Text), AppMessage.MSG0000, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No){return;}}anizeService.MoveTo(UserInfo, treeNode.Tag.ToString(), targetTr eeNode.Tag.ToString());// 往目标节点中加入被拖动节点的一份克隆targetTreeNode.Nodes.Add((TreeNode)treeNode.Clone());// 将被拖动的节点移除treeNode.Remove();}}}不足之处,希望大家都指点多留言,有错就积极改进,虽然博客园到处是高手,但是我们普通老百姓也往往需要一些实实在在的基础功能。
C#在winform上实现关于treeview与listview结合项目应用
C#在winform上实现关于treeview与listview结合项⽬应⽤C#初学:项⽬实现利⽤treeview实现左边菜单伸缩栏,右侧利⽤listview实现右侧数据显⽰,不同单项对应不同列表,当修改列表时,修改记录会显⽰在textbox ⽂本框中。
1.实现treeview树形⽬录: ⾸先,在form整体控件上添加Load事件(每当⽤户加载窗体时发⽣),⾥⾯编写两个函数:this.InitTreeView(this.treeView1);(初始化树形图设置)、this.AddNode(this.treeView1);(添加节点)。
具体代码如下:private void InitTreeView(TreeView treeView) { treeView.CheckBoxes = false;//隐藏复选框 treeView.FullRowSelect = true;//如果单击某项会选择该项及其所有⼦项,则为 true;如果单击某项仅选择项本⾝,则为 false。
默认为 false。
belEdit = false;//不能修改编辑项 treeView.PathSeparator = "\\";//⽤\符号为分隔符 treeView.ShowLines = true;//显⽰连线 treeView.ShowPlusMinus = true;//显⽰+-号 treeView.ShowRootLines = true;//是否在节点之间绘制连线 treeView.AfterSelect += new TreeViewEventHandler(treeView_AfterSelect);//委托 } public void AddNode(TreeView treeView) { //添加节点 TreeNode node = treeView.Nodes[0]; treeView.BeginUpdate(); node.Nodes.Clear(); //增加分类节点 TreeNode node1 = new TreeNode("学⽣"); TreeNode node2 = new TreeNode("⽼师"); TreeNode node3 = new TreeNode("外勤"); TreeNode node4 = new TreeNode("管理员"); node.Nodes.Add(node1); node.Nodes.Add(node2); node.Nodes.Add(node3); node.Nodes.Add(node4); treeView.EndUpdate(); }2.完成treeview和listview的过渡。
C#winform菜单权限分配,与菜单同步的treeView树状菜单权限控制使用心得
C#winform菜单权限分配,与菜单同步的treeView树状菜单权限控制使⽤⼼得在⽹上查了很多,发现没有讲述关于--C#winform菜单权限分配,与菜单同步的treeView树状菜单权限控制使⽤--的资料⾃⼰研究了⼀个使⽤⽅法。
下⾯来看看。
我有两个窗体:LOGINFRM,MAINFRM.⾸先,说明⼀点,我的菜单项是通过程序控制动态⾃动添加到树形控件菜单项的。
第⼀步,在主窗体MAINFRM中,添加公共变量public string username="";//⽤户名public string useLOA = "";//权限public int sa;//权限public int userLOA{get { return sa; }set { sa = value; }}第⼆步,在登录窗体中,UserName = txtUserName.Text.Trim();//获取⽤户名PassWrd = txtPasWrd.Text.Trim();//获取密码LOA1 = comboBox1.Text;//获取combox1的选项:⽤户⾝份获取。
Form_Main HomePage = new Form_Main();if (LOA1 == "管理员")//传递权限{erLOA = 1;}else//普通⽤户{erLOA = 2;}ername = UserName; //传递⽤户名,⽤于状态栏显⽰eLOA = LOA1;//传递权限,⽤于状态栏显⽰this.Hide();//隐藏登录窗⼝//HomePage.StartPosition = FormStartPosition.CenterScreen;//屏幕中央显⽰窗体HomePage.Show();//显⽰主窗⼝第三部在加载主窗体事件中添加private void Form_Main_Load(object sender, EventArgs e)//窗体加载事件{GetMenu(treeView1,menuStrip1);//菜单项添加到树形控件//MessageBox.Show(userLOA.ToString());//TEST-OKif (userLOA == 2)//权限限制{Excel导⼊.Enabled = false;Excel导出.Enabled = false;添加⽤户.Enabled = false;修改密码.Enabled = false;删除⽤户.Enabled = false;}toolStripStatusLabel2.Text = "当前⽤户:"+username+",权限:"+useLOA+"";//状态栏显⽰⽤户名和权限}第四步,树形菜单权限控制1//TreeView树状菜单和ToolMenuStrip菜单调⽤的是相同的窗体,下⾯通过判断23//ToolMenuStrip菜单项的状态来决定是否打开对应窗体,经过实践证明,下⾯的⽅法是有效的。
数据结构——用C语言描述 第六章 树状结构
数据结构——用C语言描述第六章树状结构在计算机科学中,数据结构是组织和存储数据的方式,以便能够高效地访问和操作这些数据。
树状结构是一种重要的数据结构,它在许多算法和应用中都发挥着关键作用。
树状结构就像是一棵倒立的树,有一个根节点,然后从根节点向下延伸出许多分支,每个分支又可以进一步延伸出更多的分支。
这种结构使得数据的组织和管理更加清晰和高效。
在树状结构中,每个节点可以包含数据以及指向其子节点的指针。
节点之间通过这些指针形成层次关系。
树状结构的一个重要特点是,除了根节点外,每个节点都有且仅有一个父节点。
二叉树是树状结构中最常见的一种形式。
二叉树中的每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉搜索树是一种特殊的二叉树,它具有一定的规则。
对于二叉搜索树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而其右子树中的所有节点的值都大于该节点的值。
这种特性使得在二叉搜索树中进行查找、插入和删除操作的效率很高。
例如,如果要在二叉搜索树中查找一个值,我们可以从根节点开始。
如果要查找的值小于当前节点的值,就向左子树继续查找;如果大于当前节点的值,就向右子树继续查找。
直到找到目标值或者确定该值不存在。
用 C 语言来实现二叉搜索树,首先需要定义一个节点结构体,来存储节点的数据以及左右子节点的指针。
```ctypedef struct TreeNode {int data;struct TreeNode left;struct TreeNode right;} TreeNode;```接下来,实现插入节点的函数。
插入节点时,需要按照二叉搜索树的规则,找到合适的位置插入新节点。
```cvoid insertNode(TreeNode root, int value) {if (root == NULL) {root =(TreeNode )malloc(sizeof(TreeNode));(root)>data = value;(root)>left = NULL;(root)>right = NULL;return;}if (value <(root)>data) {insertNode(&((root)>left), value);} else if (value >(root)>data) {insertNode(&((root)>right), value);}}```查找节点的函数也类似,根据比较值的大小在左右子树中递归查找。
Win32中TreeView控件的使用方法,类似于资源管理器中文件树形显示方式
Win32中TreeView控件的使⽤⽅法,类似于资源管理器中⽂件树形显⽰⽅式⾸先是头⽂件,内容如下:#include <tchar.h>#include "..\CommonFiles\CmnHdr.h"#include <Windows.h>#include <WindowsX.h>#include <CommCtrl.h>#include "resource.h"#pragma comment (lib,"comctl32.lib")BOOL InitTreeViewImageLists(HWND hwndTV); //该函数主要⽤于向TreeView控件中添加图⽚HTREEITEM InitTreeCtrl(HWND hwnd,PTSTR pszCaption,int nLevel);//该函数向TreeView控件中添加内容以下是实现函数:#include "InitCtrls.h"extern HINSTANCE g_hInst;extern int g_nOpen;extern int g_nClose;BOOL InitTreeViewImageLists(HWND hwndTV){HIMAGELIST himl;HBITMAP hBitmap;HICON hIcon;if((himl = ImageList_Create(16,16,FALSE,ILC_COLOR,0))==NULL)return FALSE;hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP1));hIcon = LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_ICON1));//g_nOpen = ImageList_Add(himl,hBitmap,(HBITMAP)NULL);//开始我⽤的是上⾯的⽅法,但不知道为什么添加不上,返回值-1g_nOpen = ImageList_AddIcon(himl,hIcon);DeleteObject(hIcon);hBitmap = LoadBitmap(g_hInst,MAKEINTRESOURCE(IDB_BITMAP2));hIcon = LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_ICON2));g_nClose = ImageList_AddIcon(himl,hIcon);DeleteObject(hIcon);if(ImageList_GetImageCount(himl) < 2)return FALSE;TreeView_SetImageList(GetDlgItem(GetParent(hwndTV),IDC_TREE),himl,TVSIL_NORMAL);return TRUE;}HTREEITEM InitTreeCtrl(HWND hwnd,PTSTR pszCaption,int nLevel){HWND hwndTreeCtrl = GetDlgItem(hwnd,IDC_TREE);TVITEM tvi;TVINSERTSTRUCT tvins;static HTREEITEM hPrev = (HTREEITEM)TVI_FIRST;//hPrev 代表当前加⼊的新项static HTREEITEM hPrevRootItem = NULL; //前⼀级⽬录static HTREEITEM hPrevLev2Item = NULL;HTREEITEM hti ;tvi.mask = TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_PARAM;tvi.pszText = pszCaption;hTextMax = sizeof(pszCaption)/sizeof(pszCaption[0]);tvins.item = tvi;tvins.hInsertAfter = hPrev;if(nLevel == 1)tvins.hParent = TVI_ROOT;else if(nLevel == 2)tvins.hParent = hPrevRootItem;elsetvins.hParent = hPrevLev2Item;hPrev = TreeView_InsertItem(hwndTreeCtrl,&tvins);if(nLevel == 1)hPrevRootItem = hPrev;elsehPrevLev2Item = hPrev;if(nLevel > 1){hti = TreeView_GetParent(hwndTreeCtrl,hPrev);tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; tvi.hItem = hti;tvi.iImage = g_nOpen;tvi.iSelectedImage = g_nOpen;TreeView_SetItem(hwndTreeCtrl,&tvi);}return hPrev;}。
C#动态绑定treeview控件
前台只需要放一个treeview控件就行后台protected void Page_Load(object sender, EventArgs e){if (!IsPostBack)bindTree();}private void bindTree(){DataTable dt = this.GetTreeData();this.FillNode(dt, null);}private void FillNode(DataTable dt, TreeNode node){DataView dv = new DataView(dt);if (node == null) //根结点{dv.RowFilter = "parentid='0'"; //筛选到根结点的所有子节点}else //不是根结点{dv.RowFilter = "parentid='" + node.Value + "'"; //筛选对应节点的所有子节点}foreach (DataRowView drv in dv) //遍历填充节点的所有子节点,如果传入的节点node 为叶子节点,遍历要退出,不再进行递归{TreeNode no = new TreeNode(drv["menuname"].ToString(), drv["menuid"].ToString());FillNode(dt, no); //填充no节点的子节点if (node == null){this.TreeView1.Nodes.Add(no);}else{node.ChildNodes.Add(no);}}}private DataTable GetTreeData(){string strcnn = ConfigurationManager.ConnectionStrings["treecnn"].ConnectionString;using (SqlConnection sqlcnn = new SqlConnection(strcnn)){SqlCommand sqlcmm = sqlcnn.CreateCommand();mandText = "select * from MenuTree order by parentid,menuorder"; SqlDataAdapter da = new SqlDataAdapter(sqlcmm);DataSet ds = new DataSet();da.Fill(ds);return ds.Tables[0];}}更多信息请查看IT技术专栏。
c#winformtreelistview的使用(treegridview)实例详解
c#winformtreelistview的使⽤(treegridview)实例详解TreeView控件显⽰的内容⽐较单⼀,如果需要呈现更详细信息TreeListView是⼀个不错的选择。
先看效果:⾸先需要引⽤⽂件System.Windows.Forms.TreeListView.dll、System.Runtime.InteropServices.APIs.dll你可以将TreeListView加⼊到⼯具箱中然后在添加到窗体中。
1.你需要添加列2.你需要添加⼀个ImageList作为节点图标的容器(你还需要配置TreeListView的SmallImageList属性为ImageList控件的ID)3.现在可以给控件绑定数据了此控件⽐较适合呈现具有⽗⼦级关系的复杂数据结构,当然也包含XML格式的数据下⾯尝试解析⼀个设备树XML然后绑定到控件中:<Device name="hidc-1600tv _192.168.230.188" ItemType="DVR" type="Onvif" TypeID="" Code="" location="" Description="" ID="" UniqueID="192.168.230.188"> <IP Value="192.168.230.188" /><Port Value="80" /><Username Value="admin" /><Password Value="1234" /><AuthenAddress Value="/" /><AuthenMode Value="1" /><OnvifUser Value="admin" /><OnvifPwd Value="1234" /><OnvifAddress Value="/onvif/device_service" /><RTSPUser Value="admin" /><RTSPPwd Value="1234" /><ChildDevices><Device name="" ItemType="Channel" type="" TypeID="" Code="" location="" Description="" id="" UniqueID=""><PTZEnable Value="True" /><PTZ1 Value="5" /><PTZ2 Value="15" /><PTZ3 Value="25" /><PTZ4 Value="35" /><PTZ5 Value="45" /><PTZ6 Value="55" /><PTZ7 Value="65" /><PTZ8 Value="75" /><PTZ9 Value="85" /><ChildDevices><Device name="" ItemType="RStreamer" type="" TypeID="1" Code="" location="" Description="" id=""><MediaProfile Value="1" /><Multicast Value="False" /></Device><Device name="" ItemType="RStreamer" type="" TypeID="2" Code="" location="" Description="" id=""><MediaProfile Value="2" /><Multicast Value="False" /></Device></ChildDevices></Device></ChildDevices></Device>使⽤递归算法很容易提取XML的结构public void LoadXmlTree(string xml){XDocument xDoc = XDocument.Parse(xml);TreeListViewItem item = new TreeListViewItem();string title = xDoc.Root.Attribute("name")?.Value ?? .LocalName;item.Text = title;item.ImageIndex = 0;item.SubItems.Add(xDoc.Root.Attribute("UniqueID")?.Value);item.SubItems.Add(xDoc.Root.Attribute("ItemType")?.Value);PopulateTree (xDoc.Root, item.Items);tvDevice.Items.Add(item);}public void PopulateTree (XElement element, TreeListViewItemCollection items){foreach (XElement node in element.Nodes()){TreeListViewItem item = new TreeListViewItem();string title = .LocalName.Trim();item.Text = title;if (title == "Device"){var attr = node.Attribute("ItemType")?.Value;switch (attr){case "Channel": item.ImageIndex = 1; break;case "RStreamer": item.ImageIndex = 3; break;default: break;}item.SubItems.Add(node.Attribute("UniqueID")?.Value);item.SubItems.Add(node.Attribute("ItemType")?.Value);}else{item.ImageIndex = 2;item.SubItems.Add(node.Attribute("Value")?.Value);}if (node.HasElements){PopulateTree (node, item.Items);}items.Add(item);}}说明:TreeListViewItem可构造传⼊value和imageindex,其中value会赋值给Text属性,imageindex就是节点显⽰的图标所对应的ImageList 的索引。
c#中treeview的使用方法(转)
c#中treeview的使⽤⽅法(转)本⽂主要介绍treeView控件中,添加,修改、删除节点的操作,⾸先当窗体加载的时候,我们添加上图中所⽰的节点。
当点击“Delete the Selected”按钮时,被选中的节点将被删除。
当点击“Edit the Selected”按钮式,被选中的节点变成修改状态,此时我们可以对其修改。
其代码如下:private void Form1_Load(object sender, EventArgs e){belEdit = true;//可编辑状态。
//添加⼀个节点,这个结点是根节点。
TreeNode node = new TreeNode();node.Text = "hope";treeView1.Nodes.Add(node);TreeNode node1 = new TreeNode();node1.Text = "hopeone";TreeNode node11 = new TreeNode();node11.Text ="hopeoneone";TreeNode node2 = new TreeNode();node2.Text = "hopetwo";node1.Nodes.Add(node11);//在node1下⾯在添加⼀个结点。
node.Nodes.Add(node1);//node下的两个⼦节点。
node.Nodes.Add(node2);TreeNode t = newTreeNode("basil");//作为根节点。
treeView1.Nodes.Add(t);TreeNode t1 = new TreeNode("basilone");t.Nodes.Add(t1);TreeNode t2 = new TreeNode("basiltwo");t.Nodes.Add(t2);}private void button1_Click(object sender, EventArgs e){//点击该按钮的时候,会移除选中项treeView1.Nodes.Remove(treeView1.SelectedNode);}private void button2_Click(object sender, EventArgs e){//点击这个按钮的时候,可以修改选中项注意:在使⽤这个属性的时候,必须设置belEdit =true,否则会提⽰错误。
C# GridView树状结构显示
C# GridView树状结构显⽰下⾯的树形结构代码需要GridVIew中的数据要求是按照上下级关系已经排列好的顺序,⽐如:GridViewID ParentID Name 1 0 ⽗1 2 1 ⽗1⼦1 3 1 ⽗1⼦2 4 3 ⽗1⼦2孙1 5 3 ⽗1⼦2孙2 6 0 ⽗2 7 6 ⽗2⼦⽗⼦项关系⽤递归函数实现protected void gvList_RowDataBound(object sender, GridViewRowEventArgs e){if(e.Row.RowType==DataControlRowType.DataRow){#region 数据绑定DataRowView rowView = (DataRowView) e.Row.DataItem;Label lblParentName=e.Row.FindControl("lblParentName") as Label;lblParentName.Text = GetParentName(Convert.ToInt32(rowView["ParentID"]));Button btnDel = e.Row.FindControl("btnDel") as Button;btnDel.Visible = (Convert.ToInt32(rowView["ParentID"]) != 0);#endregion#region 树形结构string id = rowView["ID"].ToString();string pid = rowView["ParentID"].ToString();string level = "1";e.Row.Attributes.Add("id",id);e.Row.Attributes.Add("pid",pid);e.Row.Attributes.Add("expand","1");if (rowView["ParentID"].ToString() == "0"){var img = new HtmlImage {Src = "../../Image/Tree/minimize.gif"};img.Attributes.Add("onclick","setExpand(this)");img.Style.Add("cursor","pointer");e.Row.Cells[1].Controls.Add(img);}else{e.Row.Cells[1].Style["padding-left"] = "20px";level = "2";}e.Row.Attributes.Add("level",level);#endregion}}以下是前台js控制节点电机事件中的显⽰和隐藏效果(判断代码“nextNode.nodeType==1”部分是因为不同浏览器可能会产⽣多余的空⽩换⾏⽽使nextNode不为空,但是nodeType为其他值)<script type="text/javascript">//树节点相关控制function hideChildren(node) {var level = parseInt(node.getAttribute("level"));var nextNode = node.nextSibling;while (nextNode != null && nextNode.nodeType==1&& parseInt(nextNode.getAttribute("level")) > level) {nextNode.style.display = "none"; nextNode = nextNode.nextSibling;}}function showChildren(node) {var level = parseInt(node.getAttribute("level"));var id = node.getAttribute("id");var nextNode = node.nextSibling;while (nextNode != null && nextNode.nodeType==1&& parseInt(nextNode.getAttribute("level")) > level) {if (nextNode.getAttribute("pid") == id) {if (node.getAttribute("expand") == "1") {nextNode.style.display = "";showChildren(nextNode);}else {nextNode.style.display = "none";}}nextNode = nextNode.nextSibling;}}function setExpand(sender) {var curNode = sender.parentNode.parentNode;if (curNode.getAttribute("expand") == "1") {curNode.setAttribute("expand", "0");sender.src = "../../Image/Tree/maximize.gif";hideChildren(curNode);}else {curNode.setAttribute("expand", "1");sender.src = "../../Image/Tree/minimize.gif";showChildren(curNode);}}</script><asp:gridview id="gvList" onrowcommand="gvList_RowCommand" onrowdatabound="gvList_RowDataBound" emptydatatext="暂⽆记录!" datakeynames="ID" cssclass="grid" autogeneratecolumns="false" runat="server"><columns><asp:boundfield itemstyle-horizontalalign="Center" visible="false" datafield="ID" itemstyle-width="20" headertext="ID"><asp:boundfield itemstyle-horizontalalign="left" datafield="DeptNo" itemstyle-width="200px" headertext="编号"><asp:boundfield itemstyle-horizontalalign="Center" datafield="DeptName" itemstyle-width="200px" headertext="名称"><asp:templatefield headertext="上级" headerstyle-width="200px"><itemstyle wrap="false" horizontalalign="Center" width="100px"><itemtemplate><asp:label id="lblParentName" runat="server"></asp:label></itemtemplate></itemstyle></asp:templatefield><asp:templatefield headertext="操作" headerstyle-width="200px"><itemstyle horizontalalign="center" width="200px"><itemtemplate><table><tbody><tr><td style="width: 50px;"> <input class="btnGrid" title="修改信息" value="编辑" type="button" /></td><td style="width: 50px;"><asp:button id="btnDel" cssclass="btnGrid" runat="server" commandargument="<%#Eval('ID') %>" tooltip="删除信息" commandname="Delet" onclientclick="return confirm('确定删除选中记录吗?')" text="删除"></asp:button></td></tr></tbody></table></itemtemplate></itemstyle></asp:templatefield></asp:boundfield></asp:boundfield></asp:boundfield></columns></asp:gridview>。
c#WPF中的TreeView使用详解
c#WPF中的TreeView使⽤详解⽬录前台后台在wpf中实现treeview的功能,可能看到很多分享的都是简单的绑定,仅此记录⾃⼰完成的功能。
前台<TreeView x:Name="chapterTree" Grid.Column="0" SelectedItemChanged="chapterTree_SelectedItemChanged" PreviewMouseRightButtonDown="chapterTree_PreviewMouseRightButtonDown" FontSize="14" ItemsSource="{Binding Path=Nodes}" > <TreeView.ContextMenu><ContextMenu><MenuItem Header="保存" Name="btnAlterData" Click="btnAlterData_Click" /><MenuItem Header="新增兄弟节点" Name="btnSaveData" Click="btnSaveData_Click"/><MenuItem Header="新增⼦节点" Name="btnSaveSonData" Click="btnSaveSonData_Click"/><MenuItem Header="删除" Name="btnDdeleteData" Click="btnDdeleteData_Click"/><MenuItem Header="上移⼀位" Name="btnUp" Click="btnUp_Click"/><MenuItem Header="下移⼀位" Name="btnDown" Click="btnDown_Click"/></ContextMenu></TreeView.ContextMenu><TreeView.ItemTemplate><HierarchicalDataTemplate DataType="{x:Type c:OrderModel}" ItemsSource="{Binding Path=ChildNodes}"><Label Content="{Binding Path=OrderName}"/></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView>后台CommandModel cm;public Command(){InitializeComponent();cm = new CommandModel();chapterTree.ItemsSource = cm.Nodes;}新建了CommandModel页⾯⽤来绑定数据(从数据库提取的数据,转换成了list)public event PropertyChangedEventHandler PropertyChanged;private ObservableCollection<OrderModel> nodes = new ObservableCollection<OrderModel>();public ObservableCollection<OrderModel> Nodes{get { return nodes; }set{nodes = value;if (PropertyChanged != null)PropertyChanged(this, new PropertyChangedEventArgs("Nodes"));}}public CommandModel(){Initiate();}private void Initiate(){using (SQLiteConnection con = new SQLiteConnection(MainWindow.sb.ToString())){DataTable table = new DataTable("MyTable");var reader = con.ExecuteReader("SELECT * FROM OrderData Order by OrderID");table.Load(reader);ObservableCollection<OrderModel> _nodes = new ObservableCollection<OrderModel>();_nodes = ConvertToList(table);//ShowTreeView();Nodes = getChildNodes(0, _nodes);}}private ObservableCollection<OrderModel> getChildNodes(long parentID, ObservableCollection<OrderModel> nodes){List<OrderModel> a = new List<OrderModel>(nodes.Where(x => x.ParentID == parentID).ToList());ObservableCollection<OrderModel> mainNodes =new ObservableCollection<OrderModel>(a);List<OrderModel> b = new List<OrderModel>(nodes.Where(x => x.ParentID != parentID).ToList());ObservableCollection<OrderModel> otherNodes =new ObservableCollection<OrderModel>(b);foreach (OrderModel node in mainNodes)node.ChildNodes = getChildNodes(node.ID, otherNodes);return mainNodes;}#region datatable转list/// <summary>/// datatable转list/// </summary>/// <param name="dt"></param>/// <returns></returns>public static ObservableCollection<OrderModel> ConvertToList(DataTable dt){// 定义集合ObservableCollection<OrderModel> ts = new ObservableCollection<OrderModel>();// 获得此模型的类型Type type = typeof(OrderModel);//定义⼀个临时变量string tempName = string.Empty;//遍历DataTable中所有的数据⾏foreach (DataRow dr in dt.Rows){OrderModel t = new OrderModel();// 获得此模型的公共属性PropertyInfo[] propertys = t.GetType().GetProperties();//遍历该对象的所有属性foreach (PropertyInfo pi in propertys){tempName = ;//将属性名称赋值给临时变量//检查DataTable是否包含此列(列名==对象的属性名)if (dt.Columns.Contains(tempName)){// 判断此属性是否有Setterif (!pi.CanWrite) continue;//该属性不可写,直接跳出//取值object value = dr[tempName];//如果⾮空,则赋给对象的属性if (value != DBNull.Value)pi.SetValue(t, value, null);}}//对象添加到泛型集合中ts.Add(t);}return ts;}#endregionmodel页⾯的列中需要添加public ObservableCollection<OrderModel> ChildNodes { get; set; }public OrderModel(){ChildNodes = new ObservableCollection<OrderModel>();}以上就是c# WPF中的TreeView使⽤详解的详细内容,更多关于c# WPF中的TreeView的资料请关注其它相关⽂章!。
C# TreeView菜单,MenuStrip菜单递归动态生成例子
这是在权限系统中设计中常用到的两种菜单处理方式private DataTable ModuleTable;private void FrmMain_Load(object sender, EventArgs e){try{InitMenu();}catch{MenuTree.Nodes.Clear();}}///<summary>///初始化菜单///</summary>protected void InitMenu(){DataSet ds= new DataSet();ds=bll.GetModuleTypeList("");RGP.BLL.RGP_Modules bll = new RGP.BLL.RGP_Modules(); ModuleTable = ds.Tables[0]; //取得所有数据得到DataTable//加载TreeView菜单LoadNode(MenuTree.Nodes, "0");//加载MenuStrip菜单ToolStripMenuItem topMenu = new ToolStripMenuItem();LoadSubMenu(ref topMenu, 0);}///<summary>///递归创建TreeView菜单(模块列表)///</summary>///<param name="node">子菜单</param>///<param name="MtID">子菜单上级ID</param>protected void LoadNode(TreeNodeCollection node, string MtID){DataView dvList = new DataView(ModuleTable);dvList.RowFilter = "ModuleTypeSuperiorID=" + MtID; //过滤父节点TreeNode nodeTemp;foreach (DataRowView dv in dvList){nodeTemp = new TreeNode();nodeTemp.Tag = dv["ModuleTypeID"].ToString() + ",0";nodeTemp.Text = dv["ModuleTypeName"].ToString(); //节点名称node.Add(nodeTemp); //加入节点//nodeTemp.SelectAction = TreeNodeSelectAction.Expand;//nodeTemp.Expanded = false;this.LoadNode(nodeTemp.Nodes, nodeTemp.Tag.ToString().Split(',')[0]); //递归//增加子模块分类RGP.BLL.RGP_Modules bll = new RGP.BLL.RGP_Modules();DataSet Module = bll.GetModuleList("ModuleTypeID=" + dv["ModuleTypeID"].ToString());int i = 0;foreach (DataRow child_dr in Module.Tables[0].Rows){if ((UserBox.GetUserTable().IsLimit == true|| (child_dr["ModuleDisabled"].ToString().ToLower() == "true"&& UserHandle.ValidationModule(int.Parse(child_dr["ModuleID"].ToString()), RGP_Ta g.Browse)))&& child_dr["IsMenu"].ToString().ToLower() == "true"){TreeNode ChildNode = new TreeNode(child_dr["ModuleName"].ToString());ChildNode.Tag = child_dr["ModuleID"].ToString() + ",1";ChildNode.Expand();nodeTemp.Nodes.Add(ChildNode);i++;}}//删除不必要的模块分类节点。
《学习使用C语言实现树结构》
《学习使用C语言实现树结构》
C语言实现树结构的主要内容如下:
一、概述
树是一种非线性的数据结构,是一种表示具有层次关系的数据项集合的数据结构。
C语言中的树结构表示为节点的形式,由根节点、叶节点和中间节点组成,以不同层次上的节点互相连接,以树的形式来表示多种信息。
二、特点
1. 树是非线性的数据结构,它比线性表更强大。
2. 树结构可以表示多种关系。
3. 树结构可以方便地实现深度优先搜索和广度优先搜索。
三、C语言树结构实现
1. 声明节点结构体:C语言中声明节点结构体时,需要包含节点的值、指针。
2. 新建树节点:新建树的首个节点时,应该为节点设置值,并将左右指针设为NULL。
3. 添加节点:根据树的特性,节点添加到树中时,需找到添加位置,并建立左右指针,指向新建节点。
4. 遍历树:遍历树的方法有前序遍历、中序遍历和后序遍历,每种遍历方法,都有它的特点。
四、应用场景
C语言树结构实现的应用在于查找、排序等数据处理相关的操作,树结构的搜索时间可比线性表快几个数量级,可在命令行
程序中使用树的实现,以提高程序的效率。
此外,树结构也可以用于建立类似文件系统的结构,可用于决策支持系统和人工智能系统中。
C#TreeView无限目录树实现方法
C#TreeView⽆限⽬录树实现⽅法本⽂实例讲述了C# TreeView⽆限⽬录树实现⽅法。
分享给⼤家供⼤家参考,具体如下:#region 绑定客户树protected void bindTreeView(){TreeView1.Nodes.Clear();string userid = Session["UserID"].ToString();string sqlwr = new SY_ADMINUSER().GetUserIDListByLoginUser(userid, "CUSTOMERSERVICE", false);DataTable dt = Maticsoft.DBUtility.DbHelperOra.Query("Select PARENTID,CUSTOMERID,CUSTOMERSHORT,CUSTOMERSERVICE from CU_CUSTOMER where ISDELETE='0' " + sqlwr + " order by CUSTOMERSHORT ").Tables[0]; //定义临时树节点TreeNode tmpNd;//特殊处理foreach (DataRow dr in dt.Rows){DataRow[] drs = dt.Select("CUSTOMERID='" + dr["PARENTID"] + "'");if (drs.Length == 0) //⽆上级节点{dr["PARENTID"] = "0";}}dt.AcceptChanges();//从DataTable中得到所有⽗节点为null的DataRow形成的数组DataRow[] rows = dt.Select("PARENTID='0'");//遍历根节点数组foreach (DataRow row in rows){tmpNd = new TreeNode();//给根节点赋值tmpNd.Value = row["CUSTOMERID"].ToString();tmpNd.Text = row["CUSTOMERSHORT"].ToString();tmpNd.Expanded = true;//将节点加⼊到树中TreeView1.Nodes.Add(tmpNd);AddTree(dt, TreeView1, tmpNd, row["CUSTOMERID"].ToString());}}public void AddTree(DataTable dt, TreeView tv, TreeNode pNode, string CUSTOMERID){DataRow[] rows = dt.Select("PARENTID='" + CUSTOMERID + "'");TreeNode tmpNd;foreach (DataRow row in rows){tmpNd = new TreeNode();//给根节点赋值tmpNd.Value = row["CUSTOMERID"].ToString();tmpNd.Text = row["CUSTOMERSHORT"].ToString();tmpNd.Expanded = true;pNode.ChildNodes.Add(tmpNd);//将节点加⼊到树中//TreeView1.Nodes.Add(pNode);AddTree(dt, TreeView1, tmpNd, row["CUSTOMERID"].ToString());}}#endregion更多关于C#相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家C#程序设计有所帮助。
C#如何自定义DataGridViewColumn来显示TreeView
C#如何自定义DataGridViewColumn来显示TreeView我们可以自定义DataGridView的DataGridViewColumn来实现自定义的列,下面介绍一下如何通过扩展DataGridViewColumn来实现一个TreeViewColumn1 TreeViewColumn类TreeViewColumn继承自DataGridViewColumn,为了动态给TreeViewColumn传入一个TreeView,这里暴露出一个公共属性_root,可以绑定一个初始化的TreeView. 另外需要重写DataGridCell类型的CellT emplate,这里返还一个TreeViewCell (需要自定义)复制代码1 /// <summary>2 /// Host TreeView In DataGridView Cell3 /// </summary>4 public class TreeViewColumn : DataGridViewColumn5 {6 public TreeViewColumn()7 : base(new TreeViewCell())8 {9 }10 [Description("Set TreeView Root in DataGridView Cell"), Category("TreeView")]11 public TreeView _root12 {13 get{return Roots.tree;}14 set{Roots.tree=value;}15 }16 public override DataGridViewCell CellT emplate17 {18 get19 {20 return base.CellT emplate;21 }22 set23 {24 // Ensure that the cell used for the template is a TreeViewCell.25 if (value != null &&26 !value.GetType().IsAssignableFrom(typeof(TreeViewCell)))27 {28 throw new InvalidCastException("Must be a TreeViewCell");29 }30 base.CellTemplate = value;31 }32 }33 }复制代码2 TreeViewCell类上面TreeViewColumn重写了CellTemplate,返回的就是自定义的TreeViewCell,这里就是具体实现其逻辑。
C#实现树型结构TreeView节点拖拽的简单功能(转)
C#实现树型结构TreeView节点拖拽的简单功能(转)本⽂摘抄博客园⾥⾯的⽜⼈。
例⼦程序运⾏效果如何下: 当然在节点拖拽时,需要注意⼏个事情: 1:拖拽时总需要有提⽰信息⽐较好,防⽌误操作后找不到被托摘到哪⾥去了。
2:⽗亲节点总不能拖拽到⾃⼰的⼦节点上,那不是死循环或者乱了辈份了不是? 为了让TreeView⽀持拖拽功能,需要注意以下⼏个属性设置及相应的事件代码。
代码实现参考如下:private void tvOrganize_ItemDrag(object sender, ItemDragEventArgs e){if (this.permissionEdit){// 开始进⾏拖放操作,并将拖放的效果设置成移动。
this.DoDragDrop(e.Item, DragDropEffects.Move);}}private void tvOrganize_DragEnter(object sender, DragEventArgs e){// 拖动效果设成移动e.Effect = DragDropEffects.Move;}private void tvOrganize_DragDrop(object sender, DragEventArgs e){// 定义⼀个中间变量TreeNode treeNode;//判断拖动的是否为TreeNode类型,不是的话不予处理if (e.Data.GetDataPresent("System.Windows.Forms.TreeNode", false)){// 拖放的⽬标节点TreeNode targetTreeNode;// 获取当前光标所处的坐标// 定义⼀个位置点的变量,保存当前光标所处的坐标点Point point = ((TreeView)sender).PointToClient(new Point(e.X, e.Y));// 根据坐标点取得处于坐标点位置的节点targetTreeNode = ((TreeView)sender).GetNodeAt(point);// 获取被拖动的节点treeNode = (TreeNode)e.Data.GetData("System.Windows.Forms.TreeNode");// 判断拖动的节点与⽬标节点是否是同⼀个,同⼀个不予处理if (BaseInterfaceLogic.TreeNodeCanMoveTo(treeNode, targetTreeNode)){if (BaseSystemInfo.ShowInformation){// 是否移动部门if (MessageBox.Show(AppMessage.Format(AppMessage.MSG0038, treeNode.Text, targetTreeNode.Text), AppMessage.MSG0000, MessageBoxButtons.YesNo, MessageBoxIcon.Questi {return;}}anizeService.MoveTo(UserInfo, treeNode.Tag.ToString(), targetTreeNode.Tag.ToString());// 往⽬标节点中加⼊被拖动节点的⼀份克隆targetTreeNode.Nodes.Add((TreeNode)treeNode.Clone());// 将被拖动的节点移除treeNode.Remove();}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#实现TreeView动态显示树形结构- aries524的专栏-CSDN博客C#实现TreeView动态显示树形结构收藏/aries524/archive/2008/10/03/3013411. aspx今日因需要,制作了一个GridView显示树形结构的例子,查阅了不少资料,实现的过程很艰辛啊。
不具体代码拿出来,大家分享一下。
数据表的创建:CREATE TABLE [crm_treemenu] ([i_Id] [int] NOT NULL ,[c_mkdm] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[v_mkmc] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[v_cdlj] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [v_img] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [i_xh] [int] NULL ,[i_childNum] [int] NULL ,[IsBasic] [char] (1) COLLATE Chinese_PRC_CI_AS NULLCONSTRAINT[DF_crm_treemenu_IsBasic] DEFAULT (1), [IsMaintainable] [char] (1) COLLATE Chinese_PRC_CI_AS NULL CONSTRAINT[DF_crm_treemenu_IsMaintainable] DEFAULT (0),[C_BS] [char] (1) COLLATE Chinese_PRC_CI_AS NULL , CONSTRAINT [PK_CRM_TREEMENU] PRIMARY KEY CLUSTERED([i_Id]) ON [PRIMARY]) ON [PRIMARY]GO存储过程SET QUOTED_IDENTIFIER ONGOSET ANSI_NULLS ONGOALTER procedure ShowPrivilegeasselect c_mkdm ,v_mkmc, '0'as fdm from crm_treemenu crm_role,crm_role_Privilegewhere len(c_mkdm) =2unionselect c_mkdm ,v_mkmc ,left(c_mkdm, len(c_mkdm) -2) as fdmfrom crm_treemenu where len(c_mkdm) >2GOSET QUOTED_IDENTIFIER OFFGOSET ANSI_NULLS ONGO前台代码:JS部分用来实现选中复选框的操作,如没有必要,可删除!<%@ Page Language="C#" AutoEventWireup="true" CodeFile="role_Privilege.aspx.cs"Inherits="BaseSetting_role_Privilege" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml" ><head runat="server"><title>无标题页</title><script language="javascript">function window.onload(){document.getElementById("trePrivitegeInfo").onclick = OnTreeNodeChecked;//这里把TreeView名改一下~ }function OnTreeNodeChecked(){var ele = event.srcElement;if(ele.type=='checkbox'){ele.className = "";var childrenDivID =ele.id.replace('CheckBox','Nodes');var div =document.getElementById(childrenDivID);if(div!=null){var checkBoxs =div.getElementsByTagName('INPUT');for(var i=0;i<checkBoxs.length;i++){if(checkBoxs[i].type=='checkbox')checkBoxs[i].checked=ele.checked;}}setParentClassName(ele);}}function setParentClassName(currCheckBox){var objParentNode=public_GetParentNode(currCheckBox);if(public_IsObjectNull(objParentNode))return;var checkBoxs =objParentNode.getElementsByTagName("INPUT");var allSelect = true;var allUnSelect = true;for(var i=0;i<checkBoxs.length;i++){if(checkBoxs[i].type=='checkbox'){if(checkBoxs[i].checked) allUnSelect = false;else allSelect = false;if((!allSelect) && (!allUnSelect)) break;}}var objParentCheckBox =public_Node2CheckBox(objParentNode);if(public_IsObjectNull(objParentCheckBox)) return;setParentClassName(objParentCheckBox);if(allSelect){objParentCheckBox.className = "";objParentCheckBox.checked = true;return;}if(allUnSelect){objParentCheckBox.className = "";objParentCheckBox.checked = false;return;}objParentCheckBox.checked = false;objParentCheckBox.className = "parentbox_style";}//得到本节点所在的Node(Div对象)function public_GetParentNode(element){var parent = element.parentNode;var upperTagName = "DIV";//如果这个元素还不是想要的tag就继续上溯while (parent &&(parent.tagName.toUpperCase() != upperTagName)) {parent = parent.parentNode ?parent.parentNode : parent.parentElement;}return parent;}function public_Node2CheckBox(element){var objID = element.getAttribute("ID");objID = objID.substring(0,objID.indexOf("Nodes"));returndocument.getElementById(objID+"CheckBox");}function public_IsObjectNull(element){if(element==null || element == "undefined")return true;elsereturn false;}</script></head><body><form id="form1" runat="server"><div><asp:TreeView ID="trePrivitegeInfo"runat="server" ShowCheckBoxes="All"ShowLines="True"></asp:TreeView></div></form></body></html>后台代码:// showPriviAction.ShowPrivilegeInfo();是用来显示数据的方法。
改成自己的数据集即可!using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using crm.entcrm.action;public partial class BaseSetting_role_Privilege :System.Web.UI.Page{/// <summary>/// 实例化ShowPrivilegeAction/// </summary>ShowPrivilegeAction showPriviAction = new ShowPrivilegeAction();protected void Page_Load(object sender, EventArgs e) {if(!IsPostBack){this.trePrivitegeInfo.Nodes.Clear();//调用递归函数,完成树形结构的生成AddTree("0", trePrivitegeInfo.Nodes);}}/// <summary>/// 递归添加树的节点/// </summary>/// <param name="fdm">父代码</param>/// <param name="nodes">节点对象的集合</param>public void AddTree(string fdm,System.Web.UI.WebControls.TreeNodeCollection nodes) {DataTable dt =showPriviAction.ShowPrivilegeInfo();DataView dvTree = new DataView(dt);// 过滤c_mkdm,得到当前的所有子节点dvTree.RowFilter = "[fdm] = " + fdm;foreach (DataRowView Row in dvTree){TreeNode Node = new TreeNode();// 添加节点Node.Value = Row["c_mkdm"].ToString();Node.Text = Row["v_mkmc"].ToString();nodes.Add(Node);//trePrivitegeInfo.Nodes.Add(Node);//Node.Expanded = true;AddTree(Row["c_mkdm"].ToString(), Node.ChildNodes); //再次递归}}#region Web Form Designer generated codeoverride protected void OnInit(EventArgs e){//// CODEGEN该调用是 Web 窗体设计器所必需的。