[C#]TreeView操作汇总

用到树,自然而然要想到递归


下面的例子是带CheckBox的TreeView,根据Datasource中的isvisible字段来确定是否勾选


加载,构造树形结构:

private void bindTree()
        {
            TreeNode RootNode = new TreeNode("总节点");
                this.treeView1.Nodes.Add(RootNode);

            DataRow[] dr = DataSource.Select("pnt is null");
            for (int i = 0; i < dr.Length; i++)
            {
                TreeNode tn = new TreeNode();
                tn.Text = dr[i]["name"].ToString();
                tn.Tag = dr[i]["id"].ToString();
                if (dr[i]["isvisible"].ToString().Equals("1"))
                    tn.Checked = true;
                else
                    tn.Checked = false;
                FillTree(tn, DataSource);
                RootNode.Nodes.Add(tn);
            }
        }

 private void FillTree(TreeNode node, DataTable dt)
     {
         DataRow[] dr = dt.Select("pnt='" + node.Tag.ToString() + "'");
           if (dr.Length > 0)
            {
                for (int i = 0; i < dr.Length; i++)
                {
                    TreeNode n = new TreeNode();
                    n.Text = dr[i]["name"].ToString();
                    n.Tag = dr[i]["id"].ToString();
                    if (dr[i]["isvisible"].ToString().Equals("1"))
                        n.Checked = true;
                    else
                        n.Checked = false;
                    if (dr[i]["pnt"].ToString() == node.Tag.ToString())
                    {
                        FillTree(n, dt);
                    }
                    node.Nodes.Add(tnn);
                }
            }
     }


勾选某个节点CheckBox后的联动处理

        private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
        {
            UpdateAllChildNodesCheck(e.Node);//更新下面的所有子节点
            UpdateAllparentNodesCheck(e.Node);//更新上面的所有父节点
            btnSave.Enabled = true;
        }
        void UpdateAllparentNodesCheck(TreeNode treeNode)
        {
            TreeNode pnt = treeNode.Parent;

            if(pnt!=null)
            {
                if(pnt.Checked&&!treeNode.Checked)//父节点选中,子节点未选中
                {
                    pnt.Checked = false;
                    UpdateAllparentNodesCheck(pnt);//递归更新父节点的父节点
                }
                else if(!pnt.Checked&&treeNode.Checked)//父节点未选中,子节点选中
                {
                    bool allCheck = true;//判断该父节点下的所有子节点是否选中
                    foreach(TreeNode n in pnt.Nodes)
                    {
                        if(false==n.Checked)//只要有一个子节点未选中,则父节点是未选中
                        {
                            allCheck = false;
                            break;
                        }
                    }
                    if(allCheck) //该父节点所有子节点都选中了
                    {
                        pnt.Checked = true;
                        UpdateAllparentNodesCheck(pnt);
                    }
                }
            }
        }

        void UpdateAllChildNodesCheck(TreeNode treeNode)
        {
            //递归更新子节点的Checkbox
            foreach (TreeNode n in treeNode.Nodes)
            {
                n.Checked = treeNode.Checked;
                if (n.Nodes.Count > 0)
                {
                    UpdateAllChildNodesCheck(n);
                }
            }
        }


最后对比数据源获取更新了的节点,形成sql:

List sAllSql = new List(255);
        private List GetUpdateSql(TreeNode tNode)
        {
            foreach (TreeNode n in tNode.Nodes)
            {
                if (n.Tag != null)
                {
                    DataRow[] adr = DataSource.Select(string.Format("funcid='{0}'", n.Tag.ToString()));
                    if (adr.Length > 0)
                    {
                        string sCheck = n.Checked ? "1" : "0";
                        if (false == sCheck.Equals(adr[0]["isvisible"].ToString()))
                        {
                                sAllSql.Add(string.Format("UPDATE {0}.TAB SET isvisible='{1}' WHERE id='{2}'",
                                    sUser, sCheck, n.Tag.ToString()));
                            if (n.Nodes.Count > 0)
                            {
                                GetUpdateSql(n);
                            }
                        }
                       else if (n.Nodes.Count > 0)
                            GetUpdateSql(n);
                    }
                }
                else if (n.Nodes.Count > 0)
                    GetUpdateSql(n);
            }

            return sAllSql;
        }


你可能感兴趣的:(C#)