我使用以下代码:
TreeNode i = treeView1.SelectedNode;
RefillTree(); //clears the tree and rebuilt it again.
treeView1.SelectedNode=i;
但是,SelectedNode仍然为空,但“i”正确引用。
我需要在树刷新后自动选择和扩展特定节点。
谢谢
答案 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