{"id":472,"date":"2011-08-22T13:15:40","date_gmt":"2011-08-22T11:15:40","guid":{"rendered":"http:\/\/hen.co.za\/blog\/?p=472"},"modified":"2011-08-22T13:15:40","modified_gmt":"2011-08-22T11:15:40","slug":"extending-the-treeview-control","status":"publish","type":"post","link":"https:\/\/hen.co.za\/blog\/2011\/08\/extending-the-treeview-control\/","title":{"rendered":"Extending the TreeView control"},"content":{"rendered":"<p>Here is a little Extension class to the TreeView control. I created it to add some new functionality that is not available in the base control. It is based on the System.Windows.Forms namespace TreeView but probably can be use relatively easy without too much modification on WPF as well (haven&#8217;t tried it yet)<\/p>\n<pre><span style=\"color: #0000ff;\">public\u00a0static\u00a0class<\/span>\u00a0TreeViewEx\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0static\u00a0int<\/span>\u00a0CheckedCount(<span style=\"color: #0000ff;\">this\u00a0TreeView<\/span>\u00a0tvw)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">int\u00a0<\/span>count\u00a0=\u00a00;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count\u00a0=\u00a0(<span style=\"color: #800000;\">from\u00a0<\/span>TreeNode\u00a0n\u00a0<span style=\"color: #800000;\">in\u00a0<\/span>tvw.Nodes\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #800000;\">where\u00a0<\/span>n.Checked\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #800000;\">select\u00a0<\/span>n).Count();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">foreach\u00a0<\/span>(<span style=\"color: #0000ff;\">TreeNode\u00a0<\/span>childNode\u00a0<span style=\"color: #0000ff;\">in\u00a0<\/span>tvw.Nodes)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count\u00a0+=\u00a0CheckedCount(childNode);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">return\u00a0<\/span>count;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0static\u00a0int<\/span>\u00a0CheckedCount(<span style=\"color: #0000ff;\">this\u00a0TreeNode<\/span>\u00a0parentNode)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">int\u00a0<\/span>count\u00a0=\u00a00;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count\u00a0=\u00a0(<span style=\"color: #800000;\">from\u00a0<\/span><span style=\"color: #0000ff;\">TreeNode\u00a0<\/span>n\u00a0<span style=\"color: #800000;\">in\u00a0<\/span>parentNode.Nodes\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #800000;\">where\u00a0<\/span>n.Checked\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #800000;\">select\u00a0<\/span>n).Count();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">foreach\u00a0<\/span>(TreeNode\u00a0childNode\u00a0in\u00a0parentNode.Nodes)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count\u00a0+=\u00a0CheckedCount(childNode);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">return\u00a0<\/span>count;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0static\u00a0List<\/span>&lt;<span style=\"color: #0000ff;\">TreeNode<\/span>&gt;\u00a0CheckedNodes(<span style=\"color: #0000ff;\">this\u00a0TreeView<\/span>\u00a0tvw)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">List<\/span>&lt;<span style=\"color: #0000ff;\">TreeNode<\/span>&gt;\u00a0checkedNodes\u00a0=\u00a0<span style=\"color: #0000ff;\">new\u00a0List<\/span>&lt;<span style=\"color: #0000ff;\">TreeNode<\/span>&gt;();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">foreach<\/span>(<span style=\"color: #0000ff;\">TreeNode\u00a0<\/span>node\u00a0in\u00a0(<span style=\"color: #800000;\">from\u00a0<\/span><span style=\"color: #0000ff;\">TreeNode\u00a0<\/span>n\u00a0<span style=\"color: #800000;\">in\u00a0<\/span>tvw.Nodes\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #800000;\">select\u00a0<\/span>n))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">if\u00a0<\/span>(node.Checked)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0checkedNodes.Add(node);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0checkedNodes.AddRange(node.CheckedNodes().ToArray());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">return\u00a0<\/span>checkedNodes;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0static\u00a0List<\/span>&lt;<span style=\"color: #0000ff;\">TreeNode<\/span>&gt;\u00a0CheckedNodes(<span style=\"color: #0000ff;\">this\u00a0TreeNode<\/span>\u00a0parentNode)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">List<\/span>&lt;<span style=\"color: #0000ff;\">TreeNode<\/span>&gt;\u00a0checkedNodes\u00a0=\u00a0<span style=\"color: #0000ff;\">new\u00a0List<\/span>&lt;<span style=\"color: #0000ff;\">TreeNode<\/span>&gt;();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">foreach\u00a0<\/span>(<span style=\"color: #0000ff;\">TreeNode\u00a0<\/span>node\u00a0in\u00a0(<span style=\"color: #800000;\">from\u00a0<\/span><span style=\"color: #0000ff;\">TreeNode\u00a0<\/span>n\u00a0<span style=\"color: #800000;\">in\u00a0<\/span>parentNode.Nodes\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #800000;\">select\u00a0<\/span>n))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">if\u00a0<\/span>(node.Checked)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0checkedNodes.Add(node);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0checkedNodes.AddRange(node.CheckedNodes().ToArray());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">return\u00a0<\/span>checkedNodes;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0static\u00a0void\u00a0<\/span>ExpandAllParents(<span style=\"color: #0000ff;\">this\u00a0TreeNode<\/span>\u00a0node)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">TreeNode\u00a0<\/span>parent\u00a0=\u00a0node.Parent;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">while\u00a0<\/span>(parent\u00a0!=\u00a0<span style=\"color: #0000ff;\">null<\/span>)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parent.Expand();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0parent\u00a0=\u00a0parent.Parent;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Here is a little Extension class to the TreeView control. I created it to add some new functionality that is not available in the base control. It is based on the System.Windows.Forms namespace TreeView but probably can be use relatively &hellip;<\/p>\n<p class=\"read-more\"><a href=\"https:\/\/hen.co.za\/blog\/2011\/08\/extending-the-treeview-control\/\">Read more &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[7,8,9,303,76,75,10],"class_list":["post-472","post","type-post","status-publish","format-standard","hentry","category-development","tag-net","tag-c","tag-code","tag-development","tag-extension","tag-treeview","tag-winforms"],"_links":{"self":[{"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/posts\/472","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/comments?post=472"}],"version-history":[{"count":5,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/posts\/472\/revisions"}],"predecessor-version":[{"id":477,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/posts\/472\/revisions\/477"}],"wp:attachment":[{"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/media?parent=472"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/categories?post=472"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/tags?post=472"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}