Как программно выбрать или прокрутить TreeNode в TreeView на основе пути строки? - PullRequest
1 голос
/ 05 августа 2010

Я реализую один из распространенных сценариев элемента управления TreeView и использую диски, файлы и папки. сделать файловую систему. Это означает, что каждый узел потенциально имеет путь.

Проблема в том, что у нас есть метод sureVisible, но мы не совсем уверены, что он делает то, что говорит. Не существует явного 'setVisible' для ложного свойства. По умолчанию все TreeNodes будут видны !!!

Может кто-нибудь придумать решение, которое доказывает, что оно работает?

Вот суть метода, с которым я работаю?

    public void selectTreeNodeFromPath(string path)
    { 
        //char[] delimiters = new char[]{ '\\' };
        //string[] pathArray = path.Split(delimiters);
        //int numberOfLvlsToProbe = pathArray.Length;

        // foreach (TreeNode node in treeDrives.Nodes)
        //   {}
    }

Вы можете видеть, что я начал атаковать эту проблему, но я столкнулся с упавшим блоком после того, как простой тестовый пример дал NO-EFFECT !!!

Ответы [ 2 ]

2 голосов
/ 05 августа 2010

TreeNodes будут видны в зависимости от расширенного состояния их родительских узлов и от того, где находится позиция прокрутки элемента управления. Метод EnsureVisible расширяет правильных родителей и прокручивает элемент управления до указанного узла.

Предполагая, что ваше дерево уже заполнено узлами, вы должны быть в состоянии вызвать EnsureVisible на последнем узле, и элемент управления развернет всех родителей. Затем вы можете установить SelectedNode, чтобы этот узел был выбран.

1 голос
/ 06 августа 2010

Вот решение:

РАБОТАЕТ И ИСПЫТЫВАЕТСЯ:

    public void selectTreeNodeFromPath(string path)
    {
        // set up some delimters to split our path on.
        char[] delimiters = new char[] { '\\' };
        // split the array and store the values inside a string array.
        string[] pathArray = path.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
        // clean up this array.
        ensurePathArrayAccuracy(ref pathArray);
        // a simple celing variable.
        int numberOfLvlsToProbe = pathArray.Length;
        // a variable for to keep an eye on the level of the TreeNode.
        int currentLevel = 0;
        // this collection always get re-populated each iteration.
        TreeNodeCollection globalTreeNCollection = treeDrives.Nodes;

        do
        {
            // start iterating through the global tree node collection.
            foreach (TreeNode rootNode in globalTreeNCollection)
            {
                // only set the level if the node level is less!
                if (rootNode.Level < pathArray.Length)
                {
                    currentLevel = rootNode.Level;

                    // the 'currentLevel' variable can also be used to help index the 'pathArray' to make comparisons straightforward with current node.
                    if (rootNode.Text == pathArray[currentLevel])
                    {
                        // update our control variables and start again, the next level down.
                        globalTreeNCollection = rootNode.Nodes;
                        // once we have found the node then ...
                        break;
                    }                       
                }
                else // this portion of code means we are at the end of the 'pathArray.'
                { 
                    treeDrives.SelectedNode = rootNode;
                    //treeDrives.SelectedNode.EnsureVisible();

                    // to make sure the loop ends ... we need to update the currentLevel counter
                    // to allow the loop to end.
                    currentLevel = numberOfLvlsToProbe;
                    break;             
                }
            }
        }
        // if the 'currentLevel' is less than the 'numberOfLvlsToProbe' then we need
        // to keep on looping till we get to the end.
        while (currentLevel < numberOfLvlsToProbe);
...