Member 12694392 Ответов: 1

Как добавить многоуровневые узлы с помощью древовидного представления?


в настоящее время я храню данные в строковом массиве с разделением'.'. мне нужно построить те же данные в виде дерева.
напр..
string[] tagdata = {"TestAlarm1.T1", "Test1.S1.S4", "TestAlarm1.T2", "test2.T1", "Test1.S1.S2.Tag1"};


Что я уже пробовал:

у меня есть следующий код wriiten, но я получаю несколько родительских узлов с одинаковым именем, что неверно.
private void Form1_Load(object sender, EventArgs e)
        {
            TreeNode node = null;

            string[] tagdata = {"TestAlarm1.T1", "Test1.S1.S4", "TestAlarm1.T2", "test2.T1", "Test1.S1.S2.Tag1"};

            for (int i = 0; i < tagdata.Length; i++)
            {
                string[] data = tagdata[i].Split('.');

                for (int j = 0; j < data.Length; j++)
                {
                    if (j == 0)
                    {
                        node = treeView1.Nodes.Add(data[j]);
                    }
                    else
                    {
                        node.Nodes.Add(data[j]);
 
                    }
                }
            }
}

Richard MacCutchan

Сначала вам нужно проверить, существует ли имя узла в дереве, прежде чем добавлять его.

Member 12694392

вот что я пытаюсь выяснить, как это можно сделать. пожалуйста помочь

1 Ответов

Рейтинг:
12

OriginalGriff

{"TestAlarm1.T1", "Test1.S1.S4", "TestAlarm1.T2", "test2.T1", "Test1.S1.S2.Tag1"}
Должен быть построен как
"TestAlarm1"
   "T1"
   "T2"
"Test1"
   "S1"
      "S4"
      "S2"
         "Tag1"
"test2"
   "T1"
Итак, разделите строку и посмотрите на первый элемент. Существует ли он в списке узлов дерева?
Если нет, создайте его.
Если да, то используйте это.
Затем посмотрите на второй элемент: существует ли он в списке узлов первого узла?
Если нет, создайте его.
Если да, то используйте это.
И так далее.

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

Цитата:
добавленная строка-это просто пример, данные могут иметь любое количество sub parent,child. мне нужна фактическая логика для сравнения текущего значения строки хранения со всеми узлами в древовидном представлении. я застрял только в этом месте

И это то, что я дал тебе!

Это довольно просто:
string[] tagdata = { "TestAlarm1.T1", "Test1.S1.S4", "TestAlarm1.T2", "test2.T1", "Test1.S1.S2.Tag1" };
myTreeView.Nodes.Clear();

TreeNode node;
foreach (string tag in tagdata)
    {
    string[] data = tag.Split('.');
    TreeNodeCollection nodes = myTreeView.Nodes;
    foreach (string name in data)
        {
        if (nodes.ContainsKey(name))
            {
            node = nodes[name];
            }
        else
            {
            node = new TreeNode(name);
            node.Name = name;
            nodes.Add(node);
            }
        nodes = node.Nodes;
        }
    }
На проектирование, написание и тестирование ушло всего 3 минуты...


Member 12694392

добавленная строка-это просто пример, данные могут иметь любое количество sub parent,child. мне нужна фактическая логика для сравнения текущего значения строки хранения со всеми узлами в древовидном представлении. я застрял только в этом месте

OriginalGriff

Ответ обновлен.

Member 12694392

это сработало спасибо