2009-12-05 5 views
4

Grouping으로 복합 데이터베이스 테이블에서 거대한 트리 뷰를 생성해야합니다.TreeView 하위 노드 채우기 문제

Grouping은 SQL Server Management Studio Express에서 볼 수 있습니다. Database 노드 다음에 고정 폴더 (예 : Database Diagrams, Tables, Views, Synonyms, ProgrammabilitySecurity)가 표시되고 하위 폴더가 그룹화됩니다.

지금까지 나는 이것을 달성하기 위해 AfterSelect 이벤트 및 처리기를 사용했습니다.

그러나 노드를 선택하기 전에 AfterSelect의 문제는 뷰어가 사용 가능한 자식이 있는지 여부를 알 수 없다는 것입니다. 확장 가능한 plus 기호가 보이지 않기 때문입니다.

BeforeExpand을 사용하고 싶습니다. 그러나 BeforeExpand의 문제는 자식이 이미 채워진 경우 작동합니다. 이 경우 그룹을 클릭해도 아무런 변화가 없습니다.

해결 방법?

코드/웹 링크가 인정됩니다.

답변

12

게으른 방식으로로드해야하는 어린이가있을 수있는 곳이면 어디에서나 "더미 자식 노드"를 추가하는 것입니다. 이것은 부모가 더하기 기호를 만들 것입니다, 그리고 당신은 당신이 다음을 수행 AfterExpand 이벤트에 코드를 추가 할 수 있습니다 (이 정확히 하나의 자식이며, 그 아이는 더미 노드 인 경우 있습니다

  • 확인하는 경우를 Tag 속성을 사용하여 더미 노드를 식별 할 수 있습니다.
  • 더미 노드가 발견되면 하위 노드를 검색하고 부모 노드에 추가하고 더미 노드를 제거하여 완료하십시오.

일반적으로 더미 노드에 "데이터로드 중입니다 ... 기다려주십시오 ..."라는 텍스트가 표시되어 사용자가 진행중인 작업에 대한 정보를 얻을 수 있습니다.

public class TreeViewSample : Form 
{ 
    private TreeView _treeView; 
    public TreeViewSample() 
    { 
     this._treeView = new System.Windows.Forms.TreeView(); 
     this._treeView.Location = new System.Drawing.Point(12, 12); 
     this._treeView.Size = new System.Drawing.Size(200, 400); 
     this._treeView.AfterExpand += 
      new TreeViewEventHandler(TreeView_AfterExpand); 
     this.ClientSize = new System.Drawing.Size(224, 424); 
     this.Controls.Add(this._treeView); 
     this.Text = "TreeView Lazy Load Sample"; 
     InitializeTreeView(); 
    } 

    void TreeView_AfterExpand(object sender, TreeViewEventArgs e) 
    { 
     if (e.Node.Nodes.Count == 1 && e.Node.Nodes[0].Tag == "dummy") 
     { 
      // this node has not yet been populated, launch a thread 
      // to get the data 
      ThreadPool.QueueUserWorkItem(state => 
      { 
       IEnumerable<SomeClass> childItems = GetData(); 
       // load the data into the tree view (on the UI thread) 
       _treeView.BeginInvoke((Action)delegate 
       { 
        PopulateChildren(e.Node, childItems); 
       }); 
      }); 
     } 
    } 

    private void PopulateChildren(TreeNode parent, IEnumerable<SomeClass> childItems) 
    { 
     TreeNode child; 
     TreeNode dummy; 
     TreeNode originalDummyItem = parent.Nodes[0]; 
     foreach (var item in childItems) 
     { 
      child = new TreeNode(item.Text); 
      dummy = new TreeNode("Loading. Please wait..."); 
      dummy.Tag = "dummy"; 
      child.Nodes.Add(dummy); 
      parent.Nodes.Add(child); 
     } 
     originalDummyItem.Remove(); 
    } 

    private IEnumerable<SomeClass> GetData() 
    { 
     // simulate that this takes some time 
     Thread.Sleep(500); 
     return new List<SomeClass> 
     { 
      new SomeClass{Text = "One"}, 
      new SomeClass{Text = "Two"}, 
      new SomeClass{Text = "Three"} 
     }; 
    } 

    private void InitializeTreeView() 
    { 
     TreeNode rootNode = new TreeNode("Root"); 
     TreeNode dummyNode = new TreeNode("Loading. Please wait..."); 
     dummyNode.Tag = "dummy"; 
     rootNode.Nodes.Add(dummyNode); 
     _treeView.Nodes.Add(rootNode); 
    } 
} 

public class SomeClass 
{ 
    public string Text { get; set; } 
} 
:

는 업데이트
내가 함께 간단한 예제를 넣어

0

모든 폴더/그룹 앞에 "+"표시가있는 것은 표준 동작이며 자녀가없는 것으로 확인되면 클릭하면 더하기 표시가 사라지고 비싼 "자녀가 있습니까?"라는 체크 표시가 저장됩니다 .

또는 노드가 하위 노드인지 여부를 결정하는 저렴한 방법이있는 경우이 정보를 제공 할 수 있습니다. This question은 자세한 정보를 제공합니다.