C# TreeView的遍历问题 TreeView中有1000+的节点,这个时候不管用非递归还是递归,遍历速度都非常慢,要7,8秒左右。如何才能更快的遍历啊。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就是把一个网页解析成了标签树,用TreeView显示,后来要遍历TreeView下生成的所有节点。速度太慢。 代码如下:递归的。 public static void Traversal(TreeNodeCollection tc, string ptext) { QueueItem item = null; foreach (TreeNode node in tc) { item = (QueueItem)node.Tag; if (item.Htmltag.Gentagtype == GeneralTagType.Text) { node.Text = ptext; } if (node.Nodes.Count > 0) { Traversal(node.Nodes, ptext); } } }---------------------------------------------------------非递归的。 private static void NonReverseTravel(TreeNode rootnode, string ptext) { Stack<TreeNode> stack = new Stack<TreeNode>(); if (rootnode == null) { return; } else { stack.Push(rootnode); while (stack.Count > 0) { TreeNode currentNode = stack.Pop(); QueueItem tempit = (QueueItem)currentNode.Tag; if (tempit.Htmltag.Gentagtype == GeneralTagType.Text) { currentNode.Text = ptext; } foreach (TreeNode tn in currentNode.Nodes) { stack.Push(tn); } } } } 代码如下:递归的。 public static void Traversal(TreeNodeCollection tc, string ptext) { QueueItem item = null; foreach (TreeNode node in tc) { item = (QueueItem)node.Tag; if (item.Htmltag.Gentagtype == GeneralTagType.Text) { node.Text = ptext; } if (node.Nodes.Count > 0) { Traversal(node.Nodes, ptext); } } }---------------------------------------------------------非递归的。 private static void NonReverseTravel(TreeNode rootnode, string ptext) { Stack<TreeNode> stack = new Stack<TreeNode>(); if (rootnode == null) { return; } else { stack.Push(rootnode); while (stack.Count > 0) { TreeNode currentNode = stack.Pop(); QueueItem tempit = (QueueItem)currentNode.Tag; if (tempit.Htmltag.Gentagtype == GeneralTagType.Text) { currentNode.Text = ptext; } foreach (TreeNode tn in currentNode.Nodes) { stack.Push(tn); } } } } 把执行代码放入 treeView1.BeginUpdate(); treeView1.EndUpdate();之间试试 应该不是遍历时速度慢,应该是这两句: node.Text = ptext;和currentNode.Text = ptext;这个地方慢了。遍历的目的干什么?为什么又要修改节点的Text? winform中使用webbrowser控件 如何将控件中的内容保存为mht文件呢?急 DragDrop and DragEnter 事件不能触发 在DataTable 中 不区分大小写的取资料,有什么简便的方法吗? 自定义控件属性显示:未将对象引用设置到对象的实例。 NHibernate如何在程序中切换数据库用户 送分题,关于打开关闭窗体的。 想换工作不 C#中应用哪些控件实现这样的列表显示?? combox控件,如何添加俩项文字在下拉筐中啊? 程序运行成功高兴散分了第一来的100分! C# 如何用按钮实现鼠标滚轮操作 windows程序怎么实现网页的样式
public static void Traversal(TreeNodeCollection tc, string ptext)
{
QueueItem item = null;
foreach (TreeNode node in tc)
{
item = (QueueItem)node.Tag;
if (item.Htmltag.Gentagtype == GeneralTagType.Text)
{
node.Text = ptext;
}
if (node.Nodes.Count > 0)
{
Traversal(node.Nodes, ptext);
}
}
}---------------------------------------------------------
非递归的。 private static void NonReverseTravel(TreeNode rootnode, string ptext)
{
Stack<TreeNode> stack = new Stack<TreeNode>();
if (rootnode == null)
{
return;
}
else
{
stack.Push(rootnode);
while (stack.Count > 0)
{
TreeNode currentNode = stack.Pop();
QueueItem tempit = (QueueItem)currentNode.Tag;
if (tempit.Htmltag.Gentagtype == GeneralTagType.Text)
{
currentNode.Text = ptext;
}
foreach (TreeNode tn in currentNode.Nodes)
{
stack.Push(tn);
}
}
}
}
public static void Traversal(TreeNodeCollection tc, string ptext)
{
QueueItem item = null;
foreach (TreeNode node in tc)
{
item = (QueueItem)node.Tag;
if (item.Htmltag.Gentagtype == GeneralTagType.Text)
{
node.Text = ptext;
}
if (node.Nodes.Count > 0)
{
Traversal(node.Nodes, ptext);
}
}
}---------------------------------------------------------
非递归的。 private static void NonReverseTravel(TreeNode rootnode, string ptext)
{
Stack<TreeNode> stack = new Stack<TreeNode>();
if (rootnode == null)
{
return;
}
else
{
stack.Push(rootnode);
while (stack.Count > 0)
{
TreeNode currentNode = stack.Pop();
QueueItem tempit = (QueueItem)currentNode.Tag;
if (tempit.Htmltag.Gentagtype == GeneralTagType.Text)
{
currentNode.Text = ptext;
}
foreach (TreeNode tn in currentNode.Nodes)
{
stack.Push(tn);
}
}
}
}
treeView1.BeginUpdate();
treeView1.EndUpdate();
之间试试
应该是这两句:
node.Text = ptext;和
currentNode.Text = ptext;这个地方慢了。遍历的目的干什么?为什么又要修改节点的Text?