Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TreeView:SelectedNode对我不起作用_C#_Winforms - Fatal编程技术网

C# TreeView:SelectedNode对我不起作用

C# TreeView:SelectedNode对我不起作用,c#,winforms,C#,Winforms,Im使用以下代码: TreeNode i = treeView1.SelectedNode; RefillTree(); //clears the tree and rebuilt it again. treeView1.SelectedNode=i; 但是,SelectedNode仍然保持为空,但是“i”正确引用 我需要在树刷新后自动选择并展开特定节点 谢谢重新填充树”到底是做什么的?如果它删除了由“i”引用的节点,那么我希望将SelectedNode属性设置为控件中不存在的节点不会有任

Im使用以下代码:

TreeNode i = treeView1.SelectedNode;

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

treeView1.SelectedNode=i;
但是,SelectedNode仍然保持为空,但是“i”正确引用

我需要在树刷新后自动选择并展开特定节点

谢谢

重新填充树”到底是做什么的?如果它删除了由“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( ) );
TreeNode节点1=新的TreeNode(“节点1”);
TreeNode节点2=新的TreeNode(“节点2”);
treeView1.Nodes.Add(node1);
treeView1.Nodes.Add(node2);
treeView1.Nodes.Clear();
treeView1.Nodes.Add(“节点1”);
treeView1.Nodes.Add(“节点2”);
//很明显,您可以在这里使用任何想要确定相等性的值
var matches=来自treeView1.Nodes中的TreeNode x
其中x.Text==node2.Text
选择x;
treeView1.SelectedNode=matches.First();
//现在正确选择Node2
Show(treeView1.SelectedNode.ToString());

在这里使用LINQ看起来很笨拙,但是TreeNodeCollection类只公开了一个使用节点名称属性的Find()方法。您也可以使用它,但同样笨重。

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

编辑:尝试此代码

    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

按名称查找节点是可行的,但是如果在不同的分支下有多个同名节点,请小心

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

selected_node_path = tree.SelectedNode.FullPath
然后,在重建treeview结构时,将添加的节点添加到树后设置为选中:

    ' 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,但是您得到了一个总体想法

调用RefillTree后,由“i”引用的节点是否仍然存在于TreeView中?您如何知道TreeView w1.SelectedNode为空?我尝试了你的代码减去RefillTree(),它对我有效。嗯,是的,它清除并重新构建了整个节点结构。但情况依然如此。选择特定节点后,程序将显示分配给其名称的DB数据。那么,有什么方法可以选择并打开以前选择的节点吗?也许你可以为我们发布RefillNodes的主体。顺便说一句,即使文本相同,如果你添加新节点,对象也不同。抱歉,它很长,填充了DB,但基本上它会清除树,然后再次创建结构。所以现在的问题是如何存储选定的节点,并在树刷新后重新选择它?但结构的重新填充是重要的一点。我敢打赌,在填充树时,您正在创建新的TreeNode对象,因此当您设置选定节点时,它将不再存在。请参阅new edit。很可能,但不一定,因为我们不知道RefillTree在做什么,因为OP没有发布该代码。很明显,因为节点对象正在消失:)无论RefillTree()在做什么,我的解决方案都会起作用。是的,我说过可能,非常,非常。。。可能:)名称将是空字符串,除非之前已将其分配给。1。仅当Text属性唯一时,建议(和接受)答案才有效。IMO应为name属性分配唯一值(即数据库键)2。我想我回答了这个问题。