asp.net|treeview|控件|页面
遍历节点
void GetAllNodeText(TreeNodeCollection tnc)
{
foreach(TreeNode node in tnc)
{
if(node.Nodes.Count!=0)
GetAllNodeText(node.Nodes);
Response.Write(node.Text + " ");
}
}
建树
private void CreateTree(TreeNodeCollection folderTreeNodeCollection , string parentID)
{
if (parentID=="")
{
dv.RowFilter= "ParentID is null";
}
else
{
dv.RowFilter= "ParentID="+"'"+parentID+"'";
}
foreach (DataRowView drv in dv)
{
TreeNode tn= new TreeNode();
tn.Expanded= true ;
tn.ID=drv.Row["TypeID"].ToString().Trim();
tn.Text=drv.Row["TypeName"].ToString().Trim();
folderTreeNodeCollection.Add(tn);
CreateTree(tn.Nodes,tn.ID);
}
}
遍历选中节点
private void getAllCheckedNode(TreeNodeCollection tnc)
{
foreach (TreeNode tn in tnc)
{
if (tn.Checked== true )
{
Response.Write(tn.Text+””);
}
if (tn.Nodes.Count>0)
{
getAllCheckedNode(tn.Nodes);
}
}
}
选中或取消选中节点 , 自动选中或取消选中期子节点
private void CheckedChildNode(TreeNode tn)
{
if (tn.Nodes.Count>0)
{
foreach (TreeNode tnn in tn.Nodes)
{
tnn.Checked=tn.Checked;
CheckedChildNode(tnn);
}
}
}
调用方法
private void TreeView1_Check( object sender, Microsoft.Web.UI.WebControls.TreeViewClickEventArgs e)
{
setAllCheckedNode(TreeView1.GetNodeFromIndex(e.Node));
}
1、全部读取并一次性展现
private void Page_Load(object sender, System.EventArgs e)
{
if(IsPostBack)
{
return;
}
DBSystem.ExecuteSQL tmp = new DBSystem.ExecuteSQL("T");
DataTable dt = tmp.GetDataTable("select * from TreeView");//从数据库抓出数据
this.AddNodes(dt,null,"0"); //添加节点
this.TreeView1.SelectedNodeIndex=""; //不选中任何节点。
/*下一节将介绍如何修改TreeView.cs 源码来取消默认选中节点的方法*/
}
/// <summary>
/// 添加节点及其包含的子节点
/// </summary>
/// <param name="dt">从数据库抓出的 DataTable</param>
/// <param name="node">将要添加子节点的父节点</param>
/// <param name="id">父节点的 ID,“0” 为根节点</param>
private void AddNodes(DataTable dt,TreeNode node,string id)
{
DataRow[] rows = dt.Select("ParentID="+id); //筛选出属于父节点 “node”的子节点集合
foreach(DataRow dr in rows) //循环子节点集合
{
TreeNode nd = new TreeNode();
nd.NavigateUrl=dr["URL"].ToString(); //设置浏览的网址
nd.NodeData=dr["NodeID"].ToString(); //存放节点 ID
nd.Text=dr["NodeName"].ToString(); //设置节点名称
this.AddNodes(dt,nd,nd.NodeData); //递归,添加该节点的子节点
if(node==null || id=="0")
{
this.TreeView1.Nodes.Add(nd); //添加至根节点
}
else
{
node.Nodes.Add(nd); //添加子节点
}
}
2、 展开节点时读取该节点的数据
TreeView 控件属性→ 自动提交(AutoPostBack) → True
TreeView 控件属性→ 事件 → 双击展开(Expand)
private void Page_Load(object sender, System.EventArgs e) { if(!IsPostBack) { this.AddSingleNode(null,"0"); //找出根节点 } this.TreeView1.SelectedNodeIndex=""; //不选中任何节点 } /// <summary> /// 展开节点时,触发的事件 /// </summary> /// <param name="sender">TreeView 控件</param> /// <param name="e"></param> private void TreeView1_Expand(object sender, Microsoft.Web.UI.WebControls.TreeViewClickEventArgs e) { TreeNode nd = this.TreeView1.GetNodeFromIndex(e.Node); //找到触发事件的节点,即正在展开的节点 if(nd.Nodes[0].NodeData=="") //第一次加载,即只有“正在加载……”这一项 { this.AddSingleNode(nd,nd.NodeData); //加载子节点 } } /// <summary> /// 只查找、添加单个节点下的子节点 /// </summary> /// <param name="node">需要添加子节点的 TreeNode</param> /// <param name="id">该节点的 NodeID </param> private void AddSingleNode(TreeNode node,string id) { if(node!=null && id!="0") { node.Nodes.Clear();//清空节点,主要是把“正在加载……”这一项移除 } DBSystem.ExecuteSQL tmp = new DBSystem.ExecuteSQL("T"); DataTable dt = tmp.GetDataTable("select * from TreeView where ParentID="+id);//从数据库抓出数据 foreach(DataRow dr in dt.Rows) //历遍所有子节点 { TreeNode nd = new TreeNode(); nd.NavigateUrl=dr["URL"].ToString(); //设置浏览的网址 nd.NodeData=dr["NodeID"].ToString(); //存放节点 ID nd.Text=dr["NodeName"].ToString(); //设置节点名称 TreeNode child = new TreeNode(); //此节点只作为“nd”展开的依据,并无它意 child.Text="正在加载……"; nd.Nodes.Add(child); if(node==null|| id=="0") { this.TreeView1.Nodes.Add(nd); //添加至根节点 } else { node.Nodes.Add(nd); //添加子节点 } } } 修改“TreeView.cs”源码,取消 TreeView 默认选中节点1、TreeView.cs 文件在文中﹐找到 “ protected override void OnLoad(EventArgs e)”事件“ protected override void OnPreRender(EventArgs e)” 事件,修改以下代码 if ((SelectedNodeIndex == "" || SelectedNodeIndex == String.Empty) && Nodes.Count > 0) //SelectedNodeIndex = "0"; //修改前 SelectedNodeIndex = ""; //修改后 2、TreeView.htc 文件在“C:\Inetpub\wwwroot\webctrl_client\1_0\ TreeView.htc”中找到“function ondocumentready()”把以下代码注释掉// verify selectedNodeIndex /****************** Change By Jerry On 2005-01-25 ******************/ /* if (getNodeFromIndex(selectedNodeIndex) == null) { if (getNodeFromIndex("0") != null) selectedNodeIndex = "0"; else selectedNodeIndex = ""; } */ /****************** Change By Jerry On 2005-01-25 ******************/在“function tryToBuildTreeFromRoot()”修改以下代码if (selectedNodeIndex.length == 0) { //prop_selectedNodeIndex = "0"; //修改前 prop_selectedNodeIndex = ""; //修改后}3、使用修改“TreeView.cs”后,重新编译一次,生成新的“Microsoft.Web.UI.WebControls.dll”。应用时只需要设置“SelectedNodeIndex”为 “” 即可 this.TreeView1.SelectedNodeIndex=""; //不选中任何节点。 使用 XML 文档创建 TreeView1、XML 文档的要求a) 描述节点名称是固定的“<treenodes></treenodes>”与“<treenode></treenode>” b) 虽然 XML 文文件对字母的大小写严格区分,但绑定时会忽略c) “<treenode></treenode>”节点中的属性,必须与 TreeView 控件中的 TreeNode 属性对应d) “<treenode></treenode>”节点中的文本不能写在节点内,只能以 “Text”属性出现,如“<treenode>Node01</treenode>”行不通,应为“<treenode Text="Node01"></treenode>”以下是一个可用于“TreeView”控件绑定源的范例﹕<?xml version="1.0" encoding="utf-8" ?><TREENODES> <TREENODE Text="Node01"> <TREENODE NavigateUrl="04.htm" Text="Node04"></TREENODE> </TREENODE> <treenode NavigateUrl="05.htm" text="Node05" NodeData="05" CheckBox="true"></treenode> <TREENODE NavigateUrl="03.htm" Text="Node03"></TREENODE></TREENODES>2、绑定的代码 this.TreeView1.TreeNodeSrc="TreeXML.xml"; this.TreeView1.DataBind();