2013-02-12 37 views
3

我在學習如何訪問ASP.Net母版頁的控件並嘗試展開特定的TreeView節點。我正在從另一個不是母版頁的頁面執行此操作。從代碼隱藏中展開ASP.Net TreeView節點

objContentPlaceHolder,objLoginView和objTreeView都具有通過使用調試器確認的值。

你可以看看這段代碼,讓我們知道爲什麼for循環中的代碼沒有執行嗎?它到達for循環,但只是在該點跳過for循環。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    Dim objContentPlaceHolder As ContentPlaceHolder 
    Dim objLoginView As LoginView 
    Dim objTreeView As TreeView 

    objContentPlaceHolder = CType(Master.FindControl("ContentPlaceHolderBody"), ContentPlaceHolder) 

    If Not objContentPlaceHolder Is Nothing Then 

     objLoginView = CType(objContentPlaceHolder.FindControl("loginViewMain"), LoginView) 

     If Not objLoginView Is Nothing Then 
      objTreeView = CType(objLoginView.FindControl("TreeViewMain"), TreeView) 

      ' Make sure all nodes for Maintenance are expanded. 
      '-------------------------------------------------- 
      For Each treenode As TreeNode In objTreeView.Nodes 
       If treenode.Text = "Maintenance" Then 
        treenode.Expand() 
       End If 
      Next treenode 
     End If 
    End If 
End Sub 

*更新*

我改變了頁面加載事件處理程序,以一個PreRenderComplete事件處理程序,你會相信它的工作?不知道爲什麼PreRender沒有,但那是它。再次感謝所有人的幫助。

回答

1
public Sub TreeView_TreeNodeDataBound(ByVal sender As Object, ByVal e As TreeNodeEventArgs ) 
     dim mapNode as SiteMapNode = e.Node.DataItem as SiteMapNode 
     If mapNode.Title = "Maintenance" then 
      e.Node.Expand() 
     End if 
    End Sub 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

     Dim objContentPlaceHolder As ContentPlaceHolder 
     Dim objLoginView As LoginView 
     Dim objTreeView As TreeView 

     objContentPlaceHolder = CType(Master.FindControl("ContentPlaceHolderBody"), ContentPlaceHolder) 

     If Not objContentPlaceHolder Is Nothing Then 

      objLoginView = CType(objContentPlaceHolder.FindControl("loginViewMain"), LoginView) 

      If Not objLoginView Is Nothing Then 
       objTreeView = CType(objLoginView.FindControl("TreeViewMain"), TreeView) 
       objTreeView.TreeNodeDataBound += TreeView_TreeNodeDataBound 
      End If 
     End If 
    End Sub 

希望這將有助於

+0

感謝您的代碼示例。我會嘗試一下,讓你知道它是如何工作的。 – 2013-02-12 16:41:48

+0

我發現「expandTreeNode(treenode)」不會執行,因爲它在跳過的for循環中。 – 2013-02-12 16:48:45

+0

@ Emad-ud-deen我猜你的treeview沒有綁定在那個時候,你應該移動這個代碼在pre_render事件處理程序 – jbl 2013-02-12 16:50:32

1

從你的榜樣,它看起來像你的邏輯是隻檢查根節點。在處理分層數據時,您需要使用遞歸邏輯來確保整個結構得到評估。

像這樣的東西是你所需要的:

Protected Sub btnSearch_Click(sender As Object, e As EventArgs) 
    For Each node As TreeNode In TreeView1.Nodes 
     ExpandNodeByValue("Maintenance", node) 
    Next 
End Sub 

Private Sub ExpandNodeByValue(value As String, parentNode As TreeNode) 
    For Each childNode As TreeNode In parentNode.ChildNodes 
     If childNode.Value.ToLower() = value.ToLower() Then 
      childNode.Expand() 
     End If 
     If childNode.ChildNodes.Count > 0 Then 
      ExpandNodeByValue(value, childNode) 
     End If 
    Next 
End Sub 

我也建議使用的DirectCast代替CType,至少暫時,以確保控制被發現。你會這樣實現:

Dim objTreeView as TreeView = DirectCast(objLoginView.FindControl("TreeViewMain"), TreeView) 
If objTreeView IsNot Nothing Then 
    'The control was found 
End If 
+0

感謝您的回覆。是的,這是根節點。如果可能,我們只想擴展根節點「維護」。我能夠從母版頁的代碼隱藏文件摺疊「維護」節點,但是當從不是母版頁的頁面訪問TreeView時,展開它們似乎很棘手。我試了一下代碼,但沒有認出「.Tag」。 – 2013-02-12 16:40:19

+0

我將node.Tag.ToString()更改爲node.Text.ToString(),因爲我認爲這正是您試圖展示的內容。你也可以顯示FindChildNode()的編碼嗎? – 2013-02-12 16:52:26

+0

@ Emad-ud-deen:我更新了一個更完整的例子。 – 2013-02-12 16:58:40