Отображение тестовых примеров TFS в TreeView на основе свойства «Папка» в виде обычного текста

Тестовые примеры, используемые в нашем отделе, были перенесены в TFS из SpiraTeam. SpiraTeam позволила хранить тестовые примеры в иерархии папок, например

Заказ / Заказ и наличие / Отправить заказ / Тест 1: отправьте обычный заказ

TFS не поддерживает эту иерархию, поэтому в процессе миграции мы скопировали иерархию папок каждого теста как обычный текст и теперь сохраняем ее в текстовом поле рабочего элемента TFS под названием «Папка».

Я работаю над небольшим приложением C #, которое позволит просматривать тестовые примеры в этой иерархии и редактировать из нее.

Я планирую построить TreeView из иерархии для отображения тестовых примеров.

У меня есть все возможности для получения тестовых примеров, и в настоящее время я храню их в WorkItemStore в приложении, но у меня две проблемы:

  1. Как мне представить эту информацию в TreeView? Я понимаю, что мне придется использовать рекурсивный алгоритм, но любое исследование по этой теме возвращает инструкции о том, как создать TreeView из реальных каталогов Windows, а не из обычного текстового поля, которое мне нужно использовать. Я начал с использования метода .Split для разделения поля «Папка» на массив строк.

  2. Как только я получу информацию в TreeView, как мне перейти к правильному тесту в WorkItemStore на основе выбора из TreeView, поскольку узлы TreeView, по-видимому, основаны на строках? Используя приведенный выше путь в качестве примера, я хотел бы более элегантное решение, чем выбор рабочего элемента из магазина WHERE [Title] = 'Test 1: Send a normal order'.

Возможно, решение моего второго вопроса будет определять, как я это реализую, и мой первый вопрос может быть неуместным.

Будем очень признательны за некоторые указатели по этому поводу.

Спасибо,

Энди


person amarsha4    schedule 27.07.2012    source источник


Ответы (1)


Вот пример программы, которую можно запустить в LinqPad. Он берет WorkItem (в данном случае это созданный мною класс) и проходит по Пути после его разделения на /, создавая узлы по ходу строки, если он находит узел в той же коллекции с тем же текстом, он использует это вместо этого.

void Main()
{
    //Create a treeview with a root node.
    TreeView tv = new TreeView();
    tv.ShowNodeToolTips = true; //Turn on tooltips for this demo.
    tv.Nodes.Add(new TreeNode("Root"));

    //These may need ordering by path before you start.
    var tfsTestCases = new[]
    {
        new WorkItem { Path = "Module/Feature1/SubFeature1/Test1", WorkItemId = 1, },
        new WorkItem { Path = "Module/Feature1/SubFeature1/Test2", WorkItemId = 2, },
        new WorkItem { Path = "Module/Feature1/SubFeature2/Test1", WorkItemId = 3, },
        new WorkItem { Path = "Module/Feature1/SubFeature2/Test2", WorkItemId = 4, },
        new WorkItem { Path = "Module/Feature2/SubFeature1/Test1", WorkItemId = 5, },
        new WorkItem { Path = "Module/Feature2/SubFeature1/Test2", WorkItemId = 6, },
    };

    //Looping through the test cases...
    foreach (var testCase in tfsTestCases)
    {
        //Start at the root of the tree for each work item.
        TreeNode lastNode = tv.Nodes[0];

        //Loop through each part of the path and create a new node.
        //Use the NodeCollection from the one we just created each time through the loop.
        //This allows the next iteration to "walk down" as it goes.
        foreach (var part in testCase.Path.Split('/'))
            lastNode = AddTreeNode(lastNode.Nodes, part);

        //Set the Tag on the last node in the loop, this is the one with the actual Test Case.
        //You can reference the Tag property of "tv.SelectedNode" to get access to the Work Item. If the Tag is null, then it's not a Test Case.
        lastNode.Tag = testCase;
        lastNode.ToolTipText = testCase.WorkItemId.ToString();  //Set for this DEMO.
    }
    //Display the tree.
    tv.Dump();
}

TreeNode AddTreeNode(TreeNodeCollection nodes, String path)
{
    //Try and find a node in the collection matching the specified pathPath.
    var node = nodes.Cast<TreeNode>().Where(node => node.Text == path).SingleOrDefault();
    //If it's not found, create it and add it to the collection of nodes we just searched.
    if (node == null)
    {
        node = new TreeNode(path);
        nodes.Add(parentNode);
    }
    //We need this later, so pass it back.
    return node;
}

class WorkItem
{
    public String Path { get; set; }
    public Int32 WorkItemId { get; set; }
    //etc.
}
person DaveShaw    schedule 27.07.2012