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 onload="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或NodeData
function 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());