2008-10-15 39 views
3

我有一個包含兩個UpdatePanel的ASP.Net 2.0頁面。第一個面板包含一個TreeView。第二個面板包含一個標籤,並由樹中的選擇來觸發。當我選擇一個節點時,標籤會按預期進行更新,並且我點擊的TreeNode將突出顯示,並且之前選擇的節點不再突出顯示。但是,如果在代碼中突出顯示(選擇)了節點,則在選擇另一個節點時不會刪除突出顯示內容。當一個asp:TreeView位於UpdatePanel中時,如何清除之前的選擇?

<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged"> 
     <SelectedNodeStyle BackColor="Pink" /> 
     </asp:TreeView> 
    </ContentTemplate> 
</asp:UpdatePanel> 
<asp:UpdatePanel ID="UpdatePanel2" runat="server" ChildrenAsTriggers="True"> 
    <ContentTemplate> 
     <asp:Label ID="Label1" runat="server" Text=" - "></asp:Label> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="TreeView1" EventName="SelectedNodeChanged" /> 
    </Triggers> 
</asp:UpdatePanel> 

在開始所述第一節點後面

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     TreeView1.Nodes.Add(new TreeNode("Test 1", "Test One")); 
     TreeView1.Nodes.Add(new TreeNode("Test 2", "Test Two")); 
     TreeView1.Nodes.Add(new TreeNode("Test 3", "Test Three")); 
     TreeView1.Nodes.Add(new TreeNode("Test 4", "Test Four")); 
     TreeView1.Nodes[0].Selected = true; 
    } 
} 

protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) 
{ 
    Label1.Text = TreeView1.SelectedValue; 
} 

的代碼被選擇的標記。爲什麼選擇另一個節點時突出顯示不被刪除?

此外,我問了一個不同的question about the same setup,我沒有得到答案。任何幫助將不勝感激。

編輯我知道設置ChildrenAsTriggers="false"將工作,但我想避免再次渲染樹,因爲它可能非常大。

回答

0

這可能是一個黑客位,但是這將清除客戶端上的選擇,避免更新面板。

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function BeginRequestHandler(sender, args) 
    { 
     var elem = args.get_postBackElement(); 
     var selectedClassName = elem.id + '_1'; 

     var arrAllElements = GetElementsByClassName(selectedClassName, elem); 
     var selectedNode = $get(elem.id + '_SelectedNode').value; 

     for(var i = 0; i < arrAllElements.length; i++) 
     { 
     if(arrAllElements[i].childNodes[0].id != selectedNode) 
      RemoveClassName(arrAllElements[i], selectedClassName); 
     } 
    } 
); 

它,除非它的價值包含在「_SelectedNode」隱藏域的所有樹節點刪除選定的樣式/班。 GetElementsByClassNameRemoveClassName在我自己的js庫中,但很明顯。

1

您需要將所有節點的選擇設置爲false。

我用這樣的事情對我的應用程序之一(另一個是我的樹視圖tvCategories):

public void RefreshSelection(string guid) 
{ 
    if (guid == string.Empty) 
     ClearNodes(tvCategories.Nodes); 
    else 
     SelectNode(guid, tvCategories.Nodes); 

} 

private void ClearNodes(TreeNodeCollection tnc) 
{ 
    foreach (TreeNode n in tnc) 
    { 
     n.Selected = false; 
     ClearNodes(n.ChildNodes); 
    } 
} 
private bool SelectNode(string guid, TreeNodeCollection tnc) 
{ 
    foreach (TreeNode n in tnc) 
    { 
     if (n.Value == guid) 
     { 
      n.Selected = true; 
      return true; 
     } 
     else 
     { 
      SelectNode(guid, n.ChildNodes); 
     } 
    } 

    return false; 
} 
+0

但是,這發生在服務器端。我不希望包含該樹的面板被更新。 – tpower 2008-10-16 06:39:17

2
/// <summary> 
    /// Remove selection from TreeView 
    /// </summary> 
    /// <param name="tree"></param> 
    public static void ClearTreeView(TreeView tree) 
    { 

     if (tree.SelectedNode != null) 
     { 
      tree.SelectedNode.Selected = false; 
     } 
    } 
相關問題