myTreeview.Nodes предоставит вам список корневых узлов, как это определено MS, что в основном означает узлы в корневой ветви дерева.
Этот код создаст список корневых узлов с дочерними элементами:
IList<TreeNode> nodesWithChildren = new List<TreeNode>();
foreach( TreeNode node in myTreeview.Nodes )
if( node.Nodes.Count > 0 ) nodesWithChildren.Add( node );
Обновление: и если вы хотите, чтобы все узлы в TreeView, у которых был дочерний элемент, независимо от того, как глубоко в дереве, то используйте немного рекурсии, например,
private static IList<TreeNode> BuildParentNodeList(TreeView treeView)
{
IList<TreeNode> nodesWithChildren = new List<TreeNode>();
foreach( TreeNode node in treeView.Nodes )
AddParentNodes(nodesWithChildren, node);
return nodesWithChildren;
}
private static void AddParentNodes(IList<TreeNode> nodesWithChildren, TreeNode parentNode)
{
if (parentNode.Nodes.Count > 0)
{
nodesWithChildren.Add( parentNode );
foreach( TreeNode node in parentNode.Nodes )
AddParentNodes( nodesWithChildren, node );
}
}
Обновление 2: метод рекурсии только с 1 циклом foreach:
private static IList<TreeNode> BuildParentNodeList(TreeView treeView)
{
IList<TreeNode> nodesWithChildren = new List<TreeNode>();
AddParentNodes( nodesWithChildren, treeView.Nodes );
return nodesWithChildren;
}
private static void AddParentNodes(IList<TreeNode> nodesWithChildren, TreeNodeCollection parentNodes )
{
foreach (TreeNode node in parentNodes)
{
if (node.Nodes.Count > 0)
{
nodesWithChildren.Add( node );
AddParentNodes(nodesWithChildren, node.Nodes);
}
}
}