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);
}
}
}
동의합니다. 30k 노드를 미리로드하지 마십시오. 사용자는 모든 항목을 보지 않습니다. 사용자가 노드를 확장하면로드를 유지하십시오. 그런 다음 노드의 모든 하위 항목의 하위 항목을로드해야합니다. 즉, 표시되는 것보다 항상 한 수준을로드해야합니다. 그렇게하면 모든 하위 노드 교차가 올바르게 표시됩니다. 검색 기능이 필요하다면 메모리에 보관 된 데이터 구조를 사용할 수 있습니다. – TaW
@Dovnvoter는 설명하기 위해 신경을 써야합니다 –
그는 UI 요소에 액세스하기 위해 여러 스레드를 사용하는 것에 대한보다 명확한 조언을 원했을 수 있습니다. 그는 나쁜 날을 보낼지도 모른다. 또는 잘못된 복수형에 유의하십시오. 아니면 단순히 downvote하는 것을 좋아합니다. 기본 SO 조언 : 절대 downvote 또는 두 마음에! – TaW