проставить галочки из второго дерева в первое treeview

dima1257
Дата: 13.05.2014 09:55:03
Добрый день.

Не получается проставить галочки из второго дерева в первое.

вот первая попытка. Действует только если деревья полностью одинаковые по структуре, но мне нужно обработать случай когда они почти одинаковы. т.е. если в первое добавили несколько новых узлов, то что бы всё равно по name и level галочка проставлялась.

private void button2_Click_1(object sender, EventArgs e)
        {   // проставление галок в первом дереве таких же как и во втором
 
            // берем первый элемент дерева на которое хотим проставить галки
 
            // проставим галки по корням берем галки из правого и ставим в левое
            for (int i = 0; i < treeView3.Nodes.Count; i++)
            {
                if (treeView3.Nodes[i].Checked == true)
                {
                    treeView2.Nodes[i].Checked = true;
                }
            }
 
            // пройдёмся по дочерним
            for (int i = 0; i < treeView3.Nodes.Count; i++)
            {
                ObxodDereva(treeView3.Nodes[i], treeView2.Nodes[i]);
            }
        }
 
        private void ObxodDereva(TreeNode a, TreeNode b)
        {
            if (a.Nodes != null) //дочерние элементы есть
            {
                for (int i = 0; i < a.Nodes.Count; i++)
                {
                    if (a.Nodes[i].Checked)
                    {
                        b.Nodes[i].Checked = true;
                    }
                    ObxodDereva(a.Nodes[i], b.Nodes[i]);
                }
            }
        }



Вот вторая попытка. уже лучше получилось, но галочка из test2 второго дерева не попадает в test2 из первого дерева.
private void button2_Click_1(object sender, EventArgs e)
        {   // проставление галок в первом дереве таких же как и во втором
 
 
            // проставить галки из tv3 в tv2 по корням
            for (int i = 0; i < tv3.Nodes.Count; i++)
            {
                for (int j = 0; j < tv2.Nodes.Count; j++)
                {
                    // если совпадает имя и уровень вложения
                    if (tv2.Nodes[j].Name == tv3.Nodes[i].Name && tv2.Nodes[j].Level == tv3.Nodes[i].Level)
                    {
                        if (tv3.Nodes[i].Checked == true)
                            tv2.Nodes[j].Checked = true;
                    }
                }
            }
 
            // пройдёмся по дочерним
            for (int i = 0; i < tv3.Nodes.Count; i++)
            {
                ObxodDereva(tv2.Nodes[i], tv3.Nodes[i]);
            }
        }
 
        /// <summary>
        /// обход по внешнему
        /// </summary>
        /// <param name="a">дерево в которое проставляем галки</param>
        /// <param name="b">дерево из которых берем галки</param>
        private void ObxodDereva(TreeNode a, TreeNode b)
        {
            if (b.Nodes != null) //дочерние элементы есть
            {
                // проход по внешнему дереву
                for (int i = 0; i < b.Nodes.Count; i++)
                {
                    // проход по внутреннему дереву
                    for (int j = 0; j < a.Nodes.Count; j++)
                    {
                        // если совпадает имя и уровень вложения
                        if (b.Nodes[i].Name == a.Nodes[j].Name && b.Nodes[i].Level == a.Nodes[j].Level)
                        {
                            if (b.Nodes[i].Checked == true)
                                a.Nodes[j].Checked = true;
                        }
                        ObxodDereva(a.Nodes[j], b.Nodes[i]);
                    }
                }
            }
        }
dima1257
Дата: 14.05.2014 01:42:24
Решил.

Я создал динамическую DataTable с полями nodeName, nodeText, nodeLevel, nodeParent, checked.
Прохожу по дереву с галочками и записываю информацию о них в строки DataTable, а потом прохожу по дереву в которое мне надо проставить галочки и проверяю соответственно если 4 этих параметра совпадают, то ставлю checked true или false соответственно.

Тему можно закрыть.