Добрый день.
Не получается проставить галочки из второго дерева в первое.
вот первая попытка. Действует только если деревья полностью одинаковые по структуре, но мне нужно обработать случай когда они почти одинаковы. т.е. если в первое добавили несколько новых узлов, то что бы всё равно по 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]);
}
}
}
}