2015-01-13 3 views
-1

웹 양식에서 asp : TreeView 컨트롤을 사용하고 코드를 노드에 채우는 동안 예상대로 확장되어 축소됩니다. 그러나 OnTreeNodeExpanded 이벤트를 추가하면 포스트 백이 발생하지만이 이벤트에 지쳐서 이벤트가 발생하지 않으며 노드가 확장되지 않습니다. 사용자가 페이지를 다시 방문 할 때 세션에서 확장 된 노드를 저장하고 TreeView 확장 상태를 복원하려고합니다. 이 방법으로 이것을 달성하는 방법에 대한 아이디어. 감사합니다. 당신은 트 리뷰의 접힌/확장 이벤트에 대한 이벤트 처리기를 추가하기 때문에Asp TreeView OnTreeNodeExpanded 이벤트로 인해 트리 뷰가 확장되지 않습니다.

<asp:TreeView ID="tvDevices" runat="server" OnTreeNodeExpanded="TvDevices_OnTreeNodeExpandedCollapsed"  OnTreeNodeCollapsed="TvDevices_OnTreeNodeExpandedCollapsed"/> 


protected void Page_Load(object sender, EventArgs e) 
    { 
     foreach (string s in devices) 
     { 
      TreeNode tn = new TreeNode(); 
      tn.Text = s.toString(); 
      tn.SelectAction = TreeNodeSelectAction.None; 
      tvDevices.Ndes.Add(tn); 
     } 
     if (IsPostBack) 
      { 
       if (Session["tvDevicesState"] == null) 
        tvDevices.CollapseAll(); //Default to collapsed state 
       else 
       { 
        RestoreTreeViewState(tvDevices.Nodes, Session["tvDevicesState"] as List<string>); 
       } 
      } 
      else 
      { 
       tvDevices.CollapseAll(); 
      } 

    } 
private void SaveTreeViewState(TreeNodeCollection treeNodes, List<string> expandedList) 
    { 
     foreach (TreeNode treeNode in treeNodes) 
     { 
      if (treeNode.ChildNodes.Count > 0) 
      { 
       if (treeNode.Expanded.HasValue && treeNode.Expanded == true) 
       { 
        expandedList.Add(treeNode.Text); 
       } 
       SaveTreeViewState(treeNode.ChildNodes, expandedList); 
      } 
     }    
    } 

    private void RestoreTreeViewState(TreeNodeCollection treeNodes, List<string> expandedList) 
    {    
     foreach (TreeNode treeNode in treeNodes) 
     { 
      treeNode.Expanded = false; 
      if (expandedList.Contains(treeNode.Text)) 
      { 
       if (treeNode.ChildNodes.Count > 0) 
       {       
        treeNode.Expanded = true; 
        RestoreTreeViewState(treeNode.ChildNodes, expandedList); 
       }     
      }     
     } 
    } 

    protected void TvDevices_OnTreeNodeExpandedCollapsed(object sender, EventArgs e) 
    {      
     List<string> expandedList = new List<string>(); 

     SaveTreeViewState(tvDevices.Nodes, expandedList); 
     Session["tvDevicesState"] = expandedList; 
    } 

답변

0

가, 지금 다시 게시를 트리거 : 여기

는 코드입니다. 트리 뷰의 이벤트 핸들러가 호출되기 전에 Page_Load 이벤트 핸들러가 호출됩니다. Page_Load 이벤트 처리기 내에서 기본적으로 축소하여 트리보기 컨트롤에서 작업을 수행하기 전에 먼저 Page.IsPostBack을 확인하십시오.

+0

나는 IsPostBack을 검사했지만 이벤트 핸들러는 아직 해고되지 않습니다. – chamza

+0

IsPostBack 검사가 포함 된 업데이트 된 코드로 질문을 편집 할 수 있습니까? 다음으로 이벤트 처리기는 어떻게 구성되어 있습니까? Page 지시문에서 autoeventwireup = true를 갖고 있습니까? 아니면 코드 숨김 파일 (대개 PageName.Designer.cs)의 이벤트에 연결된 이벤트 처리기입니까? – sudheeshix

+0

방금 ​​코드를 업데이트했고 AutoEventWireUp이 webform에서 True로 설정되었습니다. – chamza

0

OnTreeNodeExpanded 이벤트가 발생하지 않은 이유를 파악했습니다. 내 경우, 이유는 트리 노드에 첨부 된 값 속성이 없다는 것이 었습니다. 각 노드에 값을 추가 한 후 이벤트가 시작되었습니다. 다음은 작동 코드입니다. 뒤에

<asp:TreeView ID="tvDevices" runat="server" OnTreeNodeExpanded="TvDevices_OnTreeNodeExpandedCollapsed"  OnTreeNodeCollapsed="TvDevices_OnTreeNodeExpandedCollapsed"/> 

코드 :

protected void Page_Load(object sender, EventArgs e) 
{ 

     List<TreeNode> root = new List<TreeNode>(); 
     for(int i = 0; i < 5; i++) 
     { 
      root.Add(new TreeNode("Parent Node " + i, i.ToString())); 
     } 
     foreach (TreeNode tn in root) 
     { 
      tn.ChildNodes.Add(new TreeNode("First Child", "first")); 
      tn.ChildNodes.Add(new TreeNode("Second Child", "second"));        
      tvDevices.Nodes.Add(tn); 
     } 
     tvDevices.CollapseAll(); //Collapse all nodes 
     RestoreTreeViewState(tvDevices.Nodes, (List<string>)Session["tvState"] ?? new List<string>()); //Restore previously expanded nodes 

} 
private void SaveTreeViewState(TreeNodeCollection treeNodes, List<string> expandedList) 
{ 
    foreach (TreeNode treeNode in treeNodes) 
    { 
     if (treeNode.ChildNodes.Count > 0) 
     { 
      if (treeNode.Expanded.HasValue && treeNode.Expanded == true) 
      { 
       expandedList.Add(treeNode.Value); 
      } 
      SaveTreeViewState(treeNode.ChildNodes, expandedList); 
     } 
    }    
} 

private void RestoreTreeViewState(TreeNodeCollection treeNodes, List<string> expandedList) 
{    
    foreach (TreeNode treeNode in treeNodes) 
    { 

     if(expandedList.Count == 0) 
      return; 
     if (expandedList.Contains(treeNode.Value)) 
     { 
      if (treeNode.ChildNodes.Count > 0) 
      {       
       treeNode.Expand(); 
       RestoreTreeViewState(treeNode.ChildNodes, expandedList); 
      }     
     }     
    } 
} 

protected void TvDevices_OnTreeNodeExpandedCollapsed(object sender, EventArgs e) 
{      
    List<string> expandedList = new List<string>(); 
    SaveTreeViewState(tvDevices.Nodes, expandedList); 
    Session["tvDevicesState"] = expandedList; 
} 
관련 문제