无法设置TreeView.SelectedNode属性

时间:2016-02-16 16:17:42

标签: c# winforms treeview

我正在尝试在清理并重新填充树视图后设置所选节点。这是我试过的代码:

private TreeNode selectednode;
private void ElementTextChanged(object sender, EventArgs e)//saves changes to the XElements displayed in the textboxes
{
    BusinessLayer.ElementName = (sender as TextBox).Tag.ToString();
    string Type = (sender as TextBox).Name;
    string Value = (sender as TextBox).Text;

    if (TView_.SelectedNode!=null)
    {
       selectednode = TView_.SelectedNode; 
    }
    string NodePath = TView_.SelectedNode.FullPath.Replace("\\", "/");

    Telementchange.Stop();
    Telementchange.Interval = 2000;
    Telementchange.Tick += (object _sender, EventArgs _e) => {
        if (Type=="Value")
        {
            BusinessLayer.ChangeElementValue(NodePath,Value);//nembiztos hogy így kéne ezt meghívni
        }
        else
        {

            BusinessLayer.ChangeElementName(NodePath, Value);
            BusinessLayer.ElementName = Value;
        }            
        FillTree(BusinessLayer.Doc);
        TView_.SelectedNode = selectednode; //nemműködikezaszar!!!!!
        TView_.Select();
        Telementchange.Stop(); 
    };
    Telementchange.Start();   
}

在我设置TView_.SelectedNode属性后的某个季节,它为null。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

查看您展示的代码似乎是这样做的:

  • 将当前选定的Node存储在变量
  • 清理并重新填充TreeView
  • 选择存储的Node

在填充之后,这必然会失败,存储的Node不再是TreeView节点集合的一部分,除非您在填充例程中再次添加它。

我认为你不这样做。

如果要重新选择某个节点,则需要在新的节点集中标识它。如果Text足够好,可以进行递归TreeView搜索,就像L.B在this post中的回答一样(但不是接受的答案!)

答案 1 :(得分:0)

我无法通过设置SelectedNode属性来解决我的问题,所以我做了一个解决方法。

 private void RefreshTreeView()
        {

            FillTree(BusinessLayer.Doc);
            TView_.SelectedNode = _selectednode;
            ExpandToPath(TView_.TopNode, _selectedPath);                    
        }

        void ExpandToPath(TreeNode relativeRoot, string path)
        {
            char delimiter = '\\';
            List<string> elements = path.Split(delimiter).ToList();
            elements.RemoveAt(0);
            relativeRoot.Expand();
            if (elements.Count == 0)
            {
                TView_.SelectedNode = relativeRoot;
                return;
            }
            foreach (TreeNode node in relativeRoot.Nodes)
            {
                if (node.Text == elements[0])
                {
                    ExpandToPath(node, string.Join(delimiter.ToString(),elements));
                }
            }
        }