Winform TreeViewコントロールテクニック

4052 ワード


開発時にtreeviewコントロールをよく使って組織構造やディレクトリ構造を表示します.通常、属性checkedboxsと組み合わせて選択します.キャンセルの操作は次のように選択します.キャンセルの小例です.ノードを選択するとき、ノードにサブノードがある場合は、すべてのサブノードを選択できます.ノードの選択を解除し、現在のノードに親ノードが同時に存在する場合は、親ノードの選択を解除します.
 
private void trvPost_AfterCheck(object sender, TreeViewEventArgs e)

        {

            //            ,       Checked        

            if (e.Action == TreeViewAction.ByMouse || e.Action == TreeViewAction.ByKeyboard)

            {

               SetChildNodeCheckedState(e.Node, e.Node.Checked);

               SetParentNodeCheckedState(e.Node, e.Node.Checked);

            }

        }



 //       

        public void SetChildNodeCheckedState(TreeNode currNode, bool isCheckedOrNot)

        {

            if (currNode.Nodes == null) return; //       

            foreach (TreeNode tmpNode in currNode.Nodes)

            {

                tmpNode.Checked = isCheckedOrNot;

                SetChildNodeCheckedState(tmpNode, isCheckedOrNot);

            }

        }



        //       

        public void SetParentNodeCheckedState(TreeNode currNode, bool isCheckedOrNot)

        {

            if (currNode.Parent == null) return; //       

            if (isCheckedOrNot) //

            {

                currNode.Parent.Checked = isCheckedOrNot;

                SetParentNodeCheckedState(currNode.Parent, isCheckedOrNot);

            }

            else //           ,                 ,      ,         

            {

                bool checkedFlag = false;

                foreach (TreeNode tmpNode in currNode.Parent.Nodes)

                {

                    if (tmpNode.Checked)

                    {

                        checkedFlag = true;

                        break;

                    }

                }

                currNode.Parent.Checked = checkedFlag;

                SetParentNodeCheckedState(currNode.Parent, checkedFlag);

            }

        }