TreeView:SelectedNode对我不起作用

时间:2009-10-16 07:09:33

标签: c# winforms

我使用以下代码:

TreeNode i = treeView1.SelectedNode;

RefillTree(); //clears the tree and rebuilt it again.

treeView1.SelectedNode=i;

但是,SelectedNode仍然为空,但“i”正确引用。

我需要在树刷新后自动选择和扩展特定节点。

谢谢

3 个答案:

答案 0 :(得分:3)

“RefillTree”究竟做了什么?如果它删除'i'引用的节点,那么我希望将SelectedNode属性设置为控件中不存在的节点将无效。

编辑:

我几乎可以保证您正在清除控件并创建新节点来填充它。如果这些新节点包含相同的数据无关紧要,则SelectedNode查找对象相等并且找不到匹配项。例如,此代码重现您的问题:

treeView1.nodes.Add( new TreeNode( "Node 1" ) );
treeView1.nodes.Add( new TreeNode( "Node 2" ) );
treeView1.SelectedNode = new TreeNode( "Node 1" );  

// null reference exception here, we did not find a match
MessageBox.Show( treeView1.SelectedNode.ToString( ) );

因此,您可以在清除控件后按值查找节点:

TreeNode node1 = new TreeNode( "Node 1" );          
TreeNode node2 = new TreeNode( "Node 2" );                          

treeView1.Nodes.Add( node1 );
treeView1.Nodes.Add( node2 );

treeView1.Nodes.Clear( );

treeView1.Nodes.Add( "Node 1" );
treeView1.Nodes.Add( "Node 2" );

// you can obviously use any value that you like to determine equality here
var matches = from TreeNode x in treeView1.Nodes
              where x.Text == node2.Text
              select x;
treeView1.SelectedNode = matches.First<TreeNode>( );

// now correctly selects Node2
MessageBox.Show( treeView1.SelectedNode.ToString( ) );

在这里使用LINQ似乎很笨,但TreeNodeCollection类只公开一个使用节点的Name属性的Find()方法。你也可以使用它,但同样笨重。

答案 1 :(得分:3)

按名称查找节点将起作用,但请注意在不同分支下是否有多个具有相同名称的节点。

我使用的一个很好的解决方案是保存所选节点的路径:

selected_node_path = tree.SelectedNode.FullPath

然后,当您重建树视图结构时,将添加的节点设置为选中,添加到树后:

    ' create your node
    newnode = New TreeNode("node name")
    ' add it to the tree, it then gets a path
    tree.Nodes.Add(newnode)
    ' test if it's the same path
    If (newnode.FullPath = selected_node_path) Then tree.SelectedNode = newnode

PS不介意VB,但你得到了一般的想法

答案 2 :(得分:0)

RefillTree正在替换节点,因此当您尝试重置所选节点时,我不再存在。

编辑:试试这段代码

    Dim RememberMe As String = TreeView1.SelectedNode.Name()

    RefillTree()

    Dim FoundNode() As TreeNode = TreeView1.Nodes.Find(RememberMe, True)
    If FoundNode.Length > 1 Then
        ' oops, we didn't give unique values!
    Else
        TreeView1.SelectedNode = FoundNode(0)
    End If