功能表:功能组ID,功能组名称,模块ID,模块名称,功能项ID,功能项名称
        1000 系统管理  1100 用户管理 1101 添加用户
        1000 系统管理  1100 用户管理 1102 修改用户
        1000 系统管理  1100 用户管理 1103 删除用户
        1000 系统管理  1200 角色管理 1201 添加角色
        1000 系统管理  1200 角色管理 1202 修改角色
        1000 系统管理  1200 角色管理 1203 删除角色
        2000      基础数据  2100     客户管理 2101     添加客户
        2000      基础数据  2100     客户管理 2102     删除客户
        2000      基础数据  2100     客户管理 2103     修改客户      //功能模块表角色权限表: 角色ID,功功能组ID,模块ID,功能项ID
              ------------------------------------------------------------------------------------
需求:
1.treeView 填充 三级  功能组 模块 功能项。
2.treeView带复选框 支持多选,选择上级节点时 下级几点自动选中。
3.将选中的节点功能项添加到角色权限表中!感谢大家! 系统大家提供好的方法!

解决方案 »

  1.   

    1.tree填充 (代码我临时写的,没测试自己参考着)        private void SetTree()
            {
                string strSql = "select distinct 功能组名称 from 功能表";            DataSet ds = clsSql.GetDs(strSql);            if (ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow row in ds.Tables[0].Rows)
                    {
                        string 功能组名称 = row["功能组名称"].ToString();                    TreeNode aNode = new TreeNode(功能组名称);                    tree.Nodes.Add(aNode);
                        //  ------ 查找此功能组名称里的模块名称 ------
                        strSql = "Select 模块名称 From 功能表 Where 功能组名称='" + 功能组名称 + "' ";
                        DataSet ds2 = clsSql.GetDs(strSql);                    if (ds2.Tables[0].Rows.Count > 0)
                        {
                            foreach (DataRow row2 in ds2.Tables[0].Rows)
                            {
                                string 模块名称 = row2["模块名称"].ToString();                            TreeNode aaNode = new TreeNode(模块名称);                            aaNode.ImageIndex = 0;
                                aNode.Nodes.Add(aaNode);
                                
                                                            //  ------ 查找此模块名称里的功能项名称 ------
                                strSql = "Select 功能项名称 From 功能表 " +
                                        "Where 功能组名称='" + 功能组名称 + "' and 模块名称='" + 模块名称 + "' ";                            DataSet ds3 = clsSql.GetDs(strSql);                            if (ds3.Tables[0].Rows.Count > 0)
                                {
                                    foreach (DataRow row3 in ds3.Tables[0].Rows)
                                    {
                                        string 功能项名称 = row3["功能项名称"].ToString();                                    TreeNode aaaNode = new TreeNode(功能项名称);                                    aaaNode.ImageIndex = 0;
                                        aaNode.Nodes.Add(aaaNode);
                                    }
                                }                            ds3.Dispose();
                                //----------------------------
                            }
                        }                    ds2.Dispose();
                        //----------------------------
                    }
                }            ds.Dispose();            tree.ExpandAll();  //展开
            }
    2.treeView带复选框
    在treeView的属性里把CheckBoxes设置为true
    AfterCheck事件里面写下面代码        private void tree_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
            {
                if (e.Node.Checked)
                {
                    foreach (TreeNode tn in e.Node.Nodes)
                    {
                        tn.Checked = true;
                    }            }
                else
                {
                    foreach (TreeNode tn in e.Node.Nodes)
                    {
                        tn.Checked = false;
                    }
                }
            }
    3.将选中的节点功能项添加到角色权限表中            foreach (TreeNode tn in treeNode.Nodes)
                {
                    if(treeNode.Checked)
                    {
                       //在这里面处理添加到角色权限表中
                    }
                }
      

  2.   

    艾圣奇软件工厂是以模板技术为基础的软件快速开发工具,也是为了帮助软件公司:降低开发成本、提高开发速度、提高软件品质的一个辅助开发工具.     1、 此软件主要包含两个开发模板:Form模板和List模板,通过简单的xml配置和dhtml的Attribute配置,可以完成单表、多表、相关连多表的新增、删除、修改、查询、复杂查询、Lov、对指定字段加密等功能,不需要编写代码;    2、此软件包含一组美观的dhtml组件。
    如有想详细了解此软件请在百度搜索<艾圣奇软件工厂>既可看到!http://www.scgisit.com/
      

  3.   

    surlew  你好!感谢您的回复!  我想窗体LOAD的时候加载功能组信息 当点击功能组的时候调用下级菜单  有什么好的方法吗?
      

  4.   

    你在load里面写上SetTree();
    就将你的数据加载到treeview上面去了,前提是SetTree()已经在你那边的项目上写好了
      

  5.   

    http://topic.csdn.net/u/20090619/16/98091f21-2a6f-4079-a1a2-e223c49b0495.html?28513
      

  6.   

    那怎么获取上级节点的ID 呢! 我看只有TEXT 
      

  7.   


    tree.SelectedNode.Parent.Tag.ToString();
      

  8.   

    也就是说 : node.text=Name ;node.Tag=ID
      

  9.   


    恩,不过要在我开始写的那个settree()里面改改
    我举个列子
    TreeNode aNode = new TreeNode();
    aNode.text=Name;
    aNode.Tag=ID;开始那个填充的时候就要改成这样了,要不然后面取不到的
      

  10.   

    请问是这个地方吗? TreeNode aaNode = new TreeNode(模块名称);
      

  11.   

    surlew  那我先测试一下! 
      

  12.   

    surlew 可以留一下QQ 吗?
      

  13.   

    private void btnBuild_Click(object sender, EventArgs e)
            {
                this.myRegion = ExecuteSql("SELECT ID, CODE, NAME, PARENT_CODE, USER_COUNT FROM T_AREA");            trvXML.Nodes.Clear(); //trvXML为你的Treeview控件名
                TreeNode trvboot = new TreeNode("CHINA");
                trvXML.Nodes.Add(trvboot);            BuildTree("SuperID=0", this.myRegion.Select("SuperID=0")[0], trvboot);    //把SuperID改成你的父级ID,这里的0为最顶点ID值
                trvXML.Nodes[0].Expand();           
            }        //使用递归创建 TreeView
            private void BuildTree(string expression, DataRow drRow, TreeNode lstNode)
            {
                int superCount = this.myRegion.Select(expression).Length;
                if (superCount > 0)
                {
                    foreach (DataRow dr in this.myRegion.Select(expression))
                    {
                        string childExpress = string.Format("SuperID={0}", dr["ID"].ToString()); //把SuperID改成你的父级ID
                        if (this.myRegion.Select(childExpress).Length > 0)
                        {
                            TreeNode sublst = new TreeNode(dr["NAME"].ToString());
                            sublst.Tag = dr;
                            lstNode.Nodes.Add(sublst);
                            BuildTree(childExpress, dr, sublst);
                        }
                        else
                        {
                            BuildTree(childExpress, dr, lstNode);
                        }
                    }
                }
                else
                {
                    TreeNode node = new TreeNode(drRow["NAME"].ToString());
                    node.Tag = drRow;
                    lstNode.Nodes.Add(node);
                }
            }
    支持无限级分类的数据显示,更多方法,参考:
    http://topic.csdn.net/u/20090610/11/dc7942ba-901a-4bad-bb56-f77da9ecbd79.html