public int IndexOf(TreeNode treeNode) { if (!IsNodeInView(treeNode)) { return(-1); } int index = 0; if (treeNode.ParentNode == null) { var rootNodes = RootNodes.Where(r => !r.IsFiltered).ToList(); var rootNodeIndex = rootNodes.IndexOf(treeNode); if (rootNodeIndex == -1) { return(-1); } for (int i = 0; i < rootNodeIndex; i++) { index += rootNodes[i].GetYAmountCache(); } return(index); } else { var childNodes = treeNode.ParentNode.ChildNodes.Where(r => !r.IsFiltered).ToList(); var childIndex = childNodes.IndexOf(treeNode); index += childIndex + 1; if (childIndex != 0) { for (int i = 0; i < childIndex; i++) { index += childNodes[i].GetYAmountCache() - 1; } } } return(index + IndexOf(treeNode.ParentNode)); }