新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → 利用TreeView控件动态生成无限级树 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 4732 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 利用TreeView控件动态生成无限级树 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 利用TreeView控件动态生成无限级树

    项目需要,有一个树形菜单需要动态生成,联想到TreeView控件,决定用TreeView来实现

    首先注意到了TreeView控件有一个属性TreeNodeSrc
    这个属性可以指定一个固定格式的xml文件

    <?xml version="1.0" encoding="utf-8" ?>
    <TREENODES>
        <TREENODE text="aaaaaaaa" CheckBox="true"></TREENODE>
        <TREENODE text="bbbbbbbb" CheckBox="true"></TREENODE>
        <TREENODE text="cccccccccc" EXPANDED="true" CheckBox="true">
            <TREENODE text="ddddddddd" CheckBox="true"></TREENODE>
            <TREENODE text="eeeeeeeee" CheckBox="true"></TREENODE>
        </TREENODE>
        <TREENODE text="fffffffffffff" CheckBox="true"></TREENODE>
    </TREENODES>
    于是就想把数据库里的文件读出来写入一个xml文件中,然后再进行绑定
    既然是无限级菜单,肯定要用到递归来实现,于是就写了一个如下的递归算法

    private void CreateXml(XmlDocument objXMLDoc, XmlElement objRootElem, int belong)
            {
                //Get DataSet 这里的DataSet具体获取方法我省略掉了
                DataSet ds = new DataSet();
                
                foreach(DataRow dr in ds.Tables[0].Rows)
                {
                    //Create ChildNode TreeNode
                    XmlElement objXmlElem = objXMLDoc.CreateElement("TREENODE");
                    objRootElem.AppendChild(objXmlElem);

                    //Create Attributes Text
                    XmlAttribute objXmlAttText = objXMLDoc.CreateAttribute("Text");
                    objXmlAttText.Value = dr["text"].ToString().Trim();
                    objXmlElem.SetAttributeNode(objXmlAttText);

                    //Create Attributes CheckBox
                    XmlAttribute objXmlAttCB = objXMLDoc.CreateAttribute("CheckBox");
                    objXmlAttCB.Value = "True";
                    objXmlElem.SetAttributeNode(objXmlAttCB);

                    int id = int.Parse(dr["id"].ToString().Trim());
                    CreateXml(objXMLDoc, objXmlElem, id);
                }
            }

    然后用下面的方法来实现绑定

    private void BindXmlTree()
            {
                //Create Xml File
                XmlDocument objXmlDoc = new XmlDocument();

                //Insert Xml Declaration
                XmlDeclaration objXmlDeclare = objXmlDoc.CreateXmlDeclaration("1.0", "UTF-8", "yes");
                objXmlDoc.InsertBefore(objXmlDeclare, objXmlDoc.DocumentElement);

                XmlElement objRootElem = objXmlDoc.CreateElement("TREENODES");
                objXmlDoc.AppendChild(objRootElem);

                CreateXml(objXmlDoc, objRootElem, 0);

                objXmlDoc.Save("E:\\TreeMenu.xml");
                TreeView2.TreeNodeSrc = "TreeMenu.xml";
            }
    到最后两行我就停住了,因为问题出现了
    生成的objXmlDoc文件不知道用什么方式才能绑定上TreeNodeSrc
    我试了试直接 TreeView2.TreeNodeSrc = objXmlDoc;
    可是TreeNodeSrc是String型的数据,没办法
    有没有什么方法可以不保存这个objXmlDoc文件而直接绑定呢?

    于是就换了个办法来实现
    TreeView有一个节点控件叫TreeNode,直接把数据给TreeNode上

    private void CreateTree(int belong, Microsoft.Web.UI.WebControls.TreeNode rootnode)
            {
                DataSet ds = new DataSet();

                foreach(DataRow dr in ds.Tables[0].Rows)
                {
                    Microsoft.Web.UI.WebControls.TreeNode treenode = new Microsoft.Web.UI.WebControls.TreeNode();
                    treenode.Text = dr["text"].ToString().Trim();
                    treenode.CheckBox = true;
                    treenode.Expanded = true;
                    rootnode.Nodes.Add(treenode);

                    int id = int.Parse(dr["id"].ToString().Trim());
                    CreateTree(id, treenode);
                }
            }

    用的是一样的递归思想,而且我发现这样做还比较简单一些,很多TreeNode自带的属性很方便修改
    如果用Xml还要手动去添加每一个属性,麻烦
    在PageLoad里触发这个方法

    private void Page_Load(object sender, System.EventArgs e)
            {
                Microsoft.Web.UI.WebControls.TreeNode rootnode = new Microsoft.Web.UI.WebControls.TreeNode();
                rootnode.Expanded = true;
                TreeView2.Nodes.Add(rootnode);
                CreateTree(0, rootnode);
            }
    注意,这里为了实现递归,不得不添加一个空的根节点rootnode

    这样就算大致实现了
    另,数据库里的数据格式是这样的
    -----------------------------------------
    id                    text                     belong
    1                    aaaa                    0
    2                    bbbb                   0
    3                    cccc                    0
    4                    dddd                    1
    5                    eeee                    2
    6                    ffff                        4


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/8/22 14:06:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/2 16:48:45

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms