TreeView控件


功能


TreeView控件可为用户显示节点层次结构,和在Windows操作系统的资源管理器的左窗格中显示文件和文件夹一样。树视图中的各个节点都可以包含其他节点。用户可以按展开或折叠的方式显示父节点或包含子节点的节点。另外,通过将树视图的CheckBoxes属性设置为True,可以在节点旁边显示复选框,用户可以通过将节点的Checked属性设置为True或False来选中或清除节点。


2.属性


TreeView控件常用属性及说明如表1所示。



表1 TreeView控件常用属性及说明


下面详细介绍Nodes属性,该属性用于设置TreeView控件中的所有节点。


语法:


public TreeNodeCollection Nodes { get; } 
 
 
 属性值:TreeNodeCollection,表示分配给树视图控件的树节点。 
 
 
  ------------------------------------------------------------------------- 

 

  当前选中项:TreeView.SelectedNode 
 
 增加顶级节点:TreeView.Nodes.Add("Key", "Text")  
 增加同级节点:TreeView.SelectedNode.Parent.Nodes.Add("Key", "Text")  
 增加子节点:TreeView.SelectedNode.Nodes.Add("Key", "Text")  
 全部展开:TreeView.ExpandAll()  
 全部收拢:TreeView.CollapseAll()  
 重新设置TreeView  
 数据库表结构为: ID 类型名称 父级ID     复制代码代码如下: 
 
  
   
 private void loadTreeView()   
 {   
 this.货品类别TableAdapter1.Fill(superCargoDataSet1.货品类别);   
 DataTable table = superCargoDataSet1.货品类别;   
 DataRow[] row = table.Select("父级ID=0");   
 foreach (DataRow r in row)   
 {   
 TreeNode node = 货品类别TreeView.Nodes.Add(r["ID"].ToString(), r["类型名称"].ToString());   
 recursionShow(node, r["ID"].ToString());   
 }   
 }   
 private void recursionShow(TreeNode nodes, string id)   
 {   
 DataTable table = superCargoDataSet1.货品类别;   
 DataRow[] row = table.Select("父级ID=" + id);   
 if (row != null)   
 {   
 foreach (DataRow r in row)   
 {   
 TreeNode node = nodes.Nodes.Add(r["ID"].ToString(), r["类型名称"].ToString());   
 recursionShow(node, r["ID"].ToString());   
 }   
 }   
 }     
 删除选中节点和其子结点,同时删除数据库中相应记录  
 数据库表结构为: ID 类型名称 父级ID  
   复制代码代码如下: 
 
  
   
 private void 删除ToolStripButton_Click(object sender, EventArgs e)   
 {   
 if (货品类别TreeView.SelectedNode != null)   
 {   
 DataRow[] rowChildren = superCargoDataSet1.货品类别.Select("ID=" + 货品类别TreeView.SelectedNode.Name.ToString());   
 if (rowChildren != null)   
 {   
 foreach (DataRow row in rowChildren)   
 {   
 delete节点(row["ID"].ToString());   
 row.Delete();   
 }   
 }   
 货品类别TreeView.SelectedNode.Remove();   
 }   
 }   
 private void delete节点(string id)   
 {   
 DataRow[] rowChildren = superCargoDataSet1.货品类别.Select("父级ID=" + id);   
 if (rowChildren != null)   
 {   
 foreach (DataRow row in rowChildren)   
 {   
 delete节点(row["ID"].ToString());   
 row.Delete();   
 }   
 }   
 }     
 TreeView右键选中  
   复制代码代码如下: 
 
  
   
 private void treeView左侧_MouseDown( object sender , MouseEventArgs e )   
 {   
 if( e.Button == MouseButtons.Right )   
 {   
 TreeNode node = treeView左侧.GetNodeAt (e.X , e.Y);   
 if( node != null )//右键未选中节点,不改变当前选中的节点。VS2005如此。   
 {   
 this.treeView左侧.SelectedNode = node;   
 }   
 }   
 }    
   
  
 遍历TreeView节点(递归算法)private void Page_Load(object sender, System.EventArgs e)
 {
 GetAllNodeText(TreeView1.Nodes);
 }
 void GetAllNodeText(TreeNodeCollection tnc)
 {
 foreach(TreeNode node in tnc)
 {
 if(node.Nodes.Count!=0)
 GetAllNodeText(node.Nodes);
 Response.Write(node.Text + " ");
 }
 } 得到node结点的父节点
 TreeNode pnode;
 if(node.Parent is TreeNode)
 pnode=(TreeNode)node.Parent;
 else
 //node is root node 修改TreeView样式(示例)
 <iewc:TreeView id="TreeView1" runat="server" HoverStyle="color:blue;background:#00ffCC;" DefaultStyle="background:red;color:yellow;" SelectedStyle="color:red;background:#00ff00;">
 用代码:
 TreeView1.DefaultStyle["font-size"] = "20pt"; 展开时不提交,改变选择节点时才提交将autopostback设置成false;
 在body里添加 <body οnlοad="initTree()">
 然后在PageLoad里写:
 string strTreeName = "TreeView1";
 string strRef = Page.GetPostBackEventReference(TreeView1);
 string strScript = "<script language=/"JavaScript/"> /n" + "<!-- /n" + " function initTree() { /n" +" " + strTreeName + ".onSelectedIndexChange = function() { /n" + "if (event.oldTreeNodeIndex !=
 event.newTreeNodeIndex) /n" + "this.queueEvent('onselectedindexchange', event.oldTreeNodeIndex + ',' + event.newTreeNodeIndex); /n" + "window.setTimeout('" + strRef.Replace("'","//'") + "', 0, 'JavaScript'); /n" + " } /n" + " } /n" + "// --> /n" + "</script>";
 Page.RegisterClientScriptBlock("InitTree",strScript );

 这样就只有你点击的节点更改的时候才提交! TreeView结合XML
 把XML文件设置为如下格式,然后直接设置TreeNodeSrc为该XML文件就行
 <?xml version="1.0" encoding="GB2312"?>
 <TREENODES>
 <TREENODE TEXT="node0" EXPANDED="true">
 <TREENODE TEXT="node1"/>
 <TREENODE TEXT="node2"/>
 </TREENODE>
 <TREENODE TEXT="node3" NavigateURL="3.aspx"/>
 </TREENODES>
 或者用代码
 TreeView1.TreeNodeSrc="a.xml";
 TreeView1.DataBind(); 
 
 1.设置所选节点,如选中第二个节点
 function SetSelNode()
 {
 TreeView1.selectedNodeIndex="1";
 } 2.得到所选节点的Text,ID或NodeDatafunction GetAttribute()
 {
 alert(TreeView1.getTreeNode(TreeView1.selectedNodeIndex).getAttribute("Text"));
 }
 替换Text为ID或NodeData,可分别得到所选节点的ID或NodeData 3.修改节点属性,如修改第一个节点的Text
 function ModifyNode()
 {
 var node=TreeView1.getTreeNode("0");
 node.setAttribute("Text","hgknight");
 } 4.得到点击节点function TreeView1.onclick()
 {
 alert(TreeView1.getTreeNode(TreeView1.clickedNodeIndex).getAttribute("Text"));
 } 5.添加节点function AddNode()
 {
 var node=TreeView1.createTreeNode();
 node.setAttribute("Text","hgknight");
 TreeView1.add(node);
 } 6.js遍历所有节点var AllRootNode=new Array();
 AllRootNode=TreeView1.getChildren();
 AlertNode(AllRootNode); function AlertNode(NodeArray)
 {
 if(parseInt(NodeArray.length)==0)
 return;
 else
 {
 for(i=0;i<NodeArray.length;i++)
 {
 var cNode;
 cNode=NodeArray[i];
 alert(cNode.getAttribute("Text"));
 if(parseInt(cNode.getChildren().length)!=0)
 AlertNode(cNode.getChildren());