TreeView控件的展開與折疊


在窗體中添加一個TreeView控件,設置CheckBox屬性為True,綁定數據

Archive jkj = new Archive();//自定義類
        public void Bind()
        {
            DataTable rol = jkj.GetDataTable("select rolesid,description from roles","roles");
            
            this.listBox1.DataSource = rol;
            this.listBox1.DisplayMember = "description";
            this.listBox1.ValueMember = "rolesid";
            this.treeView1.Nodes.Clear();
            DataTable mod = jkj.GetDataTable("select modelno,modelename from modelname", "modelname");
            foreach (DataRow mrow in mod.Rows)
            {
                TreeNode mtn = new TreeNode();
                mtn.Text = mrow["modelename"].ToString();
                mtn.Tag = mrow["modelno"].ToString();
                this.treeView1.Nodes.Add(mtn);
                string sql = "select funcno,cname from funcname where modelno=" + int.Parse(mtn.Tag.ToString())+" order by funcno";
                DataTable fun = jkj.GetDataTable(sql, "funcname");
                foreach (DataRow frow in fun.Rows)
                {
                    TreeNode ftn = new TreeNode();
                    ftn.Text = frow["cname"].ToString();
                    ftn.Tag = frow["funcno"].ToString();
                    mtn.Nodes.Add(ftn);
                }
            }
            this.treeView1.ExpandAll();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Bind();//綁定數據源
        }

// 在TreeView控件的AfterCheck事件中加入:

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            TreeView tree = (TreeView)sender;
            tree.AfterCheck -= new TreeViewEventHandler(this.treeView1_AfterCheck);

            //折疊其他同級節點   
            TreeNode parentNode = e.Node.Parent;
            if (parentNode != null)
            {
                foreach (TreeNode tn in parentNode.Nodes)
                {
                    if (tn != e.Node)
                        tn.Collapse();
                }
            }
            else
            {
                foreach (TreeNode tn in tree.Nodes)
                {
                    if (tn != e.Node)
                        tn.Collapse();
                }
            }

            //標記該節點的所有子節點的選中狀態與該節點一致   
            foreach (TreeNode tn in e.Node.Nodes)
                tn.Checked = e.Node.Checked;

            //if   (e.Node.Checked)   
            e.Node.ExpandAll(); //如果該節點為選中,展開該節點   
            //else   
            // e.Node.Toggle(); //如果該節點沒有選中:如果該節點處於折疊狀態,則展開該節點,否則折疊它  

            //如果當前節點的父節點下的所有子節點都沒有選中,去掉父節點的選中   
            if (e.Node.Checked == false && e.Node.Parent != null)
            {
                bool found = false; //父節點的子節點中至少有一個節點被選中,則found   =   true   
                foreach (TreeNode tn in e.Node.Parent.Nodes)
                {
                    if (tn.Checked == true)
                    {
                        found = true;
                        break;
                    }
                }
                if (found == false) //沒有找到任何被選中的子節點   
                {
                    e.Node.Parent.Checked = false;
                    e.Node.Parent.Collapse();
                }
            }

            tree.AfterCheck += new TreeViewEventHandler(this.treeView1_AfterCheck);
            this.treeView1.FullRowSelect = true;

////下面的代碼作用是:選取父節點后,選取其所有子節點。
            //foreach (TreeNode tn in e.Node.Nodes)
            //{
            //    tn.Checked = e.Node.Checked;

            //}
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM