2014-05-14 5 views
2

다중 레벨에서> 30000 개의 노드로 내 treeview를 채우고 싶습니다.스레드를 통해 TreeView에 노드를 추가하는 방법 C#?

필자는이 코드를 사용하여 채우지 만 트리 뷰는 채우기 위해 30 초가 넘습니다.

어떻게 속도를 높이기 위해 멀티 스레드를 사용할 수 있습니까? 내 창 형태로

// :

private void ThesaurusFrm_Load(object sender, EventArgs e) 
     { 
      TreadPopulateTree(); 
     } 

private void TreadPopulateTree() 
     { 
      System.Threading.Thread TrPopulateTree = new System.Threading.Thread(new System.Threading.ThreadStart(PopulateTree)); 
      TrPopulateTree.Start(); 
     } 

     private void PopulateTree() 
     { 
      FillTree.TvTrees = TvThesaurusNodes; 
      FillTree Ft = new FillTree(); 
      var TreeItems = Db.LoadThesaurusTrees(); 

      if (TvThesaurusNodes.InvokeRequired) 
       TvThesaurusNodes.BeginInvoke(new MethodInvoker(() => 
       { 
        Ft.LoadTrees(TreeItems); 
       })); 
     } 

// 내 FillTree 클래스의

public static TreeView TvTrees; 

List<TreesFieldSet> TreeItems = new List<TreesFieldSet>(); 
public void LoadTrees(List<TreesFieldSet> TreeItems) 
{ 
    this.TreeItems = TreeItems; 

    TvTrees.Nodes.Clear(); 
    TvTrees.ShowPlusMinus = true; 
    TvTrees.FullRowSelect = true; 

    TvTrees.Nodes.Clear(); 
    TvTrees.BeginUpdate(); 
    LoadBaseNodes(); 
    TvTrees.EndUpdate(); 
    TvTrees.Refresh(); 
} 

private void LoadBaseNodes() 
{ 
    if (TreeItems != null) 
    { 
     int BaseParent = 0; 
     TreeNode Node; 
     foreach (TreesFieldSet Tfs in TreeItems) 
     { 
      if (Tfs.ParentId < BaseParent) 
       BaseParent = Tfs.ParentId; 
     } 
     foreach (TreesFieldSet Tfs in TreeItems) 
     { 
      if (Tfs.ParentId == BaseParent) 
      { 
       Node = TvTrees.Nodes.Add(Tfs.Title); 
       Node.Tag = Tfs.TreeId; 
       GetChildren(Node); 
      } 
     } 
    } 
} 

private void GetChildren(TreeNode Node) 
{ 
    TreeNode ChNode = null; 
    Int32 nodeCat = (Int32)Node.Tag; 
    foreach (TreesFieldSet Tfs in TreeItems) 
    { 
     if (Tfs.ParentId == nodeCat) 
     { 
      ChNode = Node.Nodes.Add(Tfs.Title); 
      ChNode.Tag = Tfs.TreeId; 
      GetChildren(ChNode); 
     } 
    } 
} 

답변

0

없음 결코 할 멀티 스레딩 UI로, 읽기는 일부의 경우지만 서면으로 문제가되지 않습니다 항상 문제입니다.

로드를 지연시킬 수 있습니다. 즉, 사용자가 볼 수있는 것만로드 한 다음 사용자가 노드를 클릭 할 때만 하위 노드를로드 할 수 있습니다. 그게 도움이되는지 similar question here에 대답했습니다.

일반적으로 "노드"와 "즉시 자식"만로드합니다.

희망이 도움이됩니다.

+1

동의합니다. 30k 노드를 미리로드하지 마십시오. 사용자는 모든 항목을 보지 않습니다. 사용자가 노드를 확장하면로드를 유지하십시오. 그런 다음 노드의 모든 하위 항목의 하위 항목을로드해야합니다. 즉, 표시되는 것보다 항상 한 수준을로드해야합니다. 그렇게하면 모든 하위 노드 교차가 올바르게 표시됩니다. 검색 기능이 필요하다면 메모리에 보관 된 데이터 구조를 사용할 수 있습니다. – TaW

+0

@Dovnvoter는 설명하기 위해 신경을 써야합니다 –

+0

그는 UI 요소에 액세스하기 위해 여러 스레드를 사용하는 것에 대한보다 명확한 조언을 원했을 수 있습니다. 그는 나쁜 날을 보낼지도 모른다. 또는 잘못된 복수형에 유의하십시오. 아니면 단순히 downvote하는 것을 좋아합니다. 기본 SO 조언 : 절대 downvote 또는 두 마음에! – TaW

관련 문제