private void WalkerRefreshNode(bool refreshAllNodes)
{
TreeNode selectedNode = tree.SelectedNode;
TreeNode bufferedNode = (TreeNode)selectedNode.Clone();
if (SelectedNode.Tag != null)
{
DataRow tag = (DataRow)selectedNode.Tag;
if (tag.Table.TableName == "example")
{
if ((selectedNode.Nodes.Count == 0) || refreshAllNodes)
{
selectedNode.Text += emptyNodeTempText;
this.ActionWalk((uint)tag["task0"], bufferedNode, 5);
selectedNode = bufferedNode; // -- doesn't work.
...
}
...
}
...
}
...
}
^这是我正在努力工作的代码。 我希望能够用自定义节点完全替换Selected节点。 但是它对我的赋值没有反应,节点保持不变。 有人可以帮我解决这个问题吗?
答案 0 :(得分:2)
为了完全替换TreeNode
,您需要从父节点的Nodes
集合中删除旧节点,并将新节点插入同一位置:
private void ReplaceNode(TreeNode oldNode, TreeNode newNode)
{
int index = oldNode.Index;
TreeNodeCollection nodesCollection = oldNode.Parent.Nodes;
nodesCollection.RemoveAt(index);
nodesCollection.Insert(index, newNode);
}
在代码中使用上述方法,您可以像这样更改代码:
if ((selectedNode.Nodes.Count == 0) || refreshAllNodes)
{
selectedNode.Text += emptyNodeTempText;
this.ActionWalk((uint)tag["task0"], bufferedNode, 5);
ReplaceNode(selectedNode, bufferedNode); // -- should work.
...
}
请注意,更换后selectedNode
仍会引用旧节点。
答案 1 :(得分:1)
首先,selectedNode是一个局部变量,设置它根本不会影响树。
Frederik提供了一个很好的答案,如何实际替换树中的节点,但根据您的评论,您实际需要的是:
tree.BeginUpdate();
try
{
this.ActionWalk((uint)tag["task0"], selectedNode, 5);
}
finally
{
tree.EndUpdate();
}
如果帽子不够快,你将不得不考虑背景工作者或类似的东西。
答案 2 :(得分:0)
看起来,因为“bufferedNode”是treeview中节点的克隆。您必须在树视图中找到原始节点,并将此节点设置为选定节点。
顺便说一句。为什么要克隆节点?这是必要的吗?
修改强>
我这样做的原因是 避免使用bufferedNode设置引用 当我正在处理时,到selectedNode 它是ActionWalk()中的节点树 慢,因为TreeView需要 每次添加一个都重新绘制 节点(减慢整个操作10x)。所以我 想要填充节点结构 背景,然后将其分配给 原始树。
您是否在ActionWalk()之前和之后尝试调用“BeginUpdate”和“EndUpdate”?它应该防止重新粉刷。
如果没有帮助。您需要将原始节点替换为克隆节点,并将其设置为选中状态。