由於微軟的TreeView設計成提交式的,所以有的人寫程序的時候喜歡在把node.NavigateUrl寫成本頁再加上一個參數(我原來也喜歡這么做),這樣做的后果是一提交之后,treeView又回到原來的樣式,原來點的節點又縮回去,讓用戶不知道點了哪一個節點,網上有很多人給了思路,以下是解決方法。
一:首先在給節點賦值的時候不要給NavigateUrl賦值。把整個TreeView的TreeView1.ExpandDepth設成1級或者二級,看你的情況而定,默認為全部展開。
二:給TreeView添加SelectedNodeChanged事件,如下:
protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
{
string typeId = TreeView1.SelectedNode.Value;
string typeName = TreeView1.SelectedNode.Text;
string path = "Default.aspx?typeId=" + typeId + "&typeName=" + Server.UrlEncode(typeName);
Context.Items["path"] = TreeView1.SelectedNode.ValuePath;
Server.Transfer(path);
}
三:在Page_load事件加入以下代碼:
if (!IsPostBack)
{
if (Context.Items["path"] != null)
{
TreeNode node = TreeView1.FindNode(Context.Items["path"].ToString()) as TreeNode;
if (node != null)
{
expand(node);
node.Selected = true;
}
}
}
四:另外寫一個方法 expand(TreeNode node)
private void expand(TreeNode node)
{
if (node.Parent != null)
{
node.Parent.Expanded = true;
expand(node.Parent);
}
}
五:設置一下SelectNodeStyle,使選擇的節點滿足您的要求。
注意:
關於TreeView的OnSelectedNodeChanged事件
只有節點(Node)的SelectAction被設定為Select時才能夠觸發該事件,而TreeView的DataSource如果為siteMap則默認該屬性值為None,並且如果節點(Node)的Target屬性被設定為一個url則會忽略OnSelectedNodeChanged,而直接跳轉到該url
因此使用siteMap作為TreeView的數據源時,添加OnTreeNodeDataBound事件的回調方法,將上訴2個屬性進行變更

Treeview HTML
<asp:TreeView ID="tvAcc" runat="server" ShowLines="True" ExpandDepth="1" NodeIndent="0" LeafNodeStyle-Width="100%" NodeStyle-Width="100%" ParentNodeStyle-Width="100%" RootNodeStyle-Width="100%" SelectedNodeStyle-Width="100%" OnSelectedNodeChanged="tvAcc_SelectedNodeChanged"> <Nodes> <asp:TreeNode Text="Test1" Value="Test1"> <asp:TreeNode Text="Test11" Value="Test11"> <asp:TreeNode Text="Test111" Value="Test111"></asp:TreeNode> </asp:TreeNode> </asp:TreeNode> <asp:TreeNode Text="Test2" Value="Test2"> <asp:TreeNode Text="Test11" Value="Test11"> <asp:TreeNode Text="Test111" Value="Test111"></asp:TreeNode> </asp:TreeNode> <asp:TreeNode Text="Test22" Value="Test22"> <asp:TreeNode Text="Test221" Value="Test221"></asp:TreeNode> <asp:TreeNode Text="Test222" Value="Test222"></asp:TreeNode> </asp:TreeNode> </asp:TreeNode> <asp:TreeNode Text="Test3" Value="Test3"> <asp:TreeNode Text="Test31" Value="Test31"> <asp:TreeNode Text="Test311" Value="Test311"></asp:TreeNode> </asp:TreeNode> </asp:TreeNode> <asp:TreeNode Text="Test4" Value="Test4"> <asp:TreeNode Text="Test41" Value="Test41"></asp:TreeNode> </asp:TreeNode> </Nodes> </asp:TreeView>
后台代碼:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (Context.Items["path"] != null) { TreeNode node = tvAcc.FindNode(Context.Items["path"].ToString()) as TreeNode; if (node != null) { expand(node); node.Selected = true; } } } } private void expand(TreeNode node) { if (node.Parent != null) { node.Parent.Expanded = true; expand(node.Parent); } } protected void tvAcc_SelectedNodeChanged(object sender, EventArgs e) { string typeId = tvAcc.SelectedNode.Value; string typeName = tvAcc.SelectedNode.Text; string path = "Default.aspx?typeId=" + typeId + "&typeName=" + Server.UrlEncode(typeName); //在Node.Value中保存NavigationUrl信息,通過Server.Transfer跳轉到指定頁面。替換掉此處Sample用的Default.aspx Context.Items["path"] = tvAcc.SelectedNode.ValuePath; Server.Transfer(path);//Response.Redirect(path); }
Backup for 動態綁定TreeView后台Sample:
View Code
private void BindDocNode() { TreeNode rootDoc = new TreeNode("Document Center", "Document Center", "", "#", ""); rootDoc.Expanded = false; tvAcc.Nodes.Add(rootDoc); DocBLL docBLL = new DocBLL(); DataTable dtDoc = new DataTable(); dtDoc = docBLL.GetItems(); for (int i = 0; i < dtDoc.Rows.Count; i++) { string itemID = dtDoc.Rows[i]["ID"].ToString(); string itemTitle = dtDoc.Rows[i]["itemTitle"].ToString(); TreeNode treeDoc = new TreeNode(itemTitle, "DocumentCenter.aspx?did=" + itemID, "", "", ""); rootDoc.ChildNodes.Add(treeDoc); } }
