Я думаю, что проблема может заключаться в том, что когда вы создаете дочерние узлы, они являются технически разными объектами, даже если все их свойства одинаковы.Таким образом, node.Contains (childnode) в этом случае не вернет true.
Вместо этого вы можете добавить функцию, которая перебирает все свойства имени на узле, ища совпадение:
public bool CheckNameExists(TreeNode parent, string text)
{
foreach (TreeNode item in parent.Nodes)
{
if (item.Name == text) return true;
}
return false;
}
Итак, я бы взял ваш второй пример и изменил бы его на:
if(CheckNameExists(treeViewLeft.Nodes[0].Nodes[index1].Nodes[index2], childnode.Name) == false)
{
treeViewLeft.Nodes[0].Nodes[index1].Nodes[index2].Nodes.Add(childnode);
}