2013-02-12 35 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