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

Спасибо за образец кода. Я попробую и дам вам знать, как это работает. –

+0

Я обнаружил, что «expandTreeNode (treenode)» не будет выполняться, потому что он находится в цикле for, который пропускается. –

+0

@ Emad-ud-deen Я предполагаю, что ваше дерево не связано в то время, вы должны переместить этот код в обработчик события pre_render – jbl

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». –

+0

Я изменил node.Tag.ToString() на node.Text.ToString(), потому что я думаю, это было то, что вы пытались показать. Также вы можете показать кодировку FindChildNode()? –

+0

@ Emad-ud-deen: Я обновил более полный пример. –

Смежные вопросы