无法将TreeNode分配给Treeview.SelectedNode

时间:2009-07-20 08:01:32

标签: .net winforms

    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节点。 但是它对我的赋值没有反应,节点保持不变。 有人可以帮我解决这个问题吗?

3 个答案:

答案 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”?它应该防止重新粉刷。

如果没有帮助。您需要将原始节点替换为克隆节点,并将其设置为选中状态。