【问题标题】:Can't set TreeView.SelectedNode Property无法设置 TreeView.SelectedNode 属性
【发布时间】:2016-02-16 16:17:42
【问题描述】:

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

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 属性后的某个季节,它为空。 感谢您的帮助!

【问题讨论】:

  • 为什么确定有选中的节点?
  • 是的,但由于某种原因,在调试器中查看时,Handle 和 FullPath 属性引发了异常。
  • 是的,但我必须想办法解决。 (很抱歉没有写出解决方案,但我有点忘了我在这里问过。)

标签: c# winforms treeview


【解决方案1】:

查看您显示的代码,您似乎可以这样做:

  • 将当前选中的Node存储在一个变量中
  • 清洁并重新填充TreeView
  • 选择存储的Node

这肯定会失败,因为在填充之后的那一刻,存储的Node 不再是TreeView 的节点集合的一部分,除非您在填充例程中再次添加它..

我认为你不会那样做。

如果您想重新选择某个节点,您需要在新的节点集合中识别它。如果Text 足够好,请执行递归TreeView 搜索,如this post 中LB 的答案中的那个(虽然不是公认的答案!)

【讨论】:

    【解决方案2】:

    我无法通过设置 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));
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      相关资源
      最近更新 更多