【原】提高篇:第七篇,制作树形菜单之一

源代码下载

制作树形菜单的原理是:首先连接数据库,将数据按照树的结构形式返回,在客户端遍历数据时,将每条记录生成一个treepanel,然后在每个treepanel都包含在一个Panel组件里面,最后在将每个Panel组件都添加到一个上级Panel组件里面,最后在将这个上级Panel添加到Viewport里面.这里用到三个Ext组件,分别是:Viewport ; Panel ; TreePanel.

这里先简单介绍下这三个组件:

1,Panel 是Ext控件的基础,它可以用来创建非常漂亮的界面,是一个功能强大,使用却非常简单的容器组件.像面板的展开与关闭功能就非常不错.

2,TreePanel,看名字就知道树的组件就是继承自Panel 组件,在以前如果要在客户端实现一个树是很麻烦的,要处理样式,写很多的脚本,并且还要考虑Ajax.但是现在就方便多了,你要做的就是设置几个属性而已,唯一要注意的是,在显示一棵树时,必须为它指定一个根节点,不过,这更简单.

3,Viewport 代表整个浏览器的显示区域,并会随着显示区域的大小而自动改变,一个页面有且只能够有一个Viewport .

下面在将代码复制出来之前,先看看效果图,因为效果图很精美,能够增加你的胃口:

按顺序将效果图依次展开,包括面板关闭,面板展开,树菜单展开,树菜单依次展开等

 

    

 1,将整个页面完整复制过来,你就会发现,Ext仅仅几行代码就能够实现非常强大的应用

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="index.aspx.cs" Inherits="Example_TreeAutoLoad_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>测试树形菜单</title>
    <link rel="Stylesheet" type="text/css" href="ExtJS/resources/css/ext-all.css" />
    <link rel="Stylesheet" type="text/css" href="ExtJS/resources/css/xtheme-purple.css" />
    <link rel="Stylesheet" type="text/css" />
    <script type="text/javascript" src="ExtJS/adapter/ext/ext-base.js"></script>
    <script type="text/javascript" src="ExtJS/ext-all.js"></script>
    <script type="text/javascript" src="ExtJS/ext-lang-zh_CN.js"></script>
    <style type="text/css">
    .panel_icon { background-image:url(images/first.gif)}
    .center_icon { background-image:url(images/center.png)}
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div>  
    <script type="text/javascript">
    //以下是关键代码 因为是提高篇,所以假想你已经对Ext很熟悉了,
    //即使不熟悉也没有关系,我会继续把未完的基础篇尽快完成
    function makeTreeMenu()
    {
        var panel_west = new Ext.Panel
        ({
            id:'panWestMenu',
            region:'center',
            title:'销售管理系统',
            split:true,
            width: 200,
            collapsible: true,
            margins:'0 0 0 0',
            layout:'accordion',
            layoutConfig:{animate:true}
        });
        var viewport = new Ext.Viewport
        ({
            id:'vpMain',
            layout:'border',
            items:
            [
                panel_west
            ]
        });       
        var CreateMenuPanel = function(title,TypeID)
        {
              return new Ext.Panel
              ({
                  title:title,layout:'fit',border: false,frame:true,                    
                  items:
                  [{
                      xtype:'treepanel',singleExpand:true,animate:true,autoScroll:true,containerScroll: true,
                      border: false,
                      width:200,height:370,enableDD:false,dropConfig: {appendOnly:true},                         
                      loader: new Ext.tree.TreeLoader({dataUrl:"json.aspx?Param=1"}),                         
                      root:new Ext.tree.AsyncTreeNode
                      ({
                          id:TypeID,
                          text: title,
                          draggable:false,
                          expanded:true
                         
                      })
                  }]
             });
        };     
        //加载左面的数据
        var loadPanelWest = function()
        {
             Ext.Ajax.request
             ({
                    url: 'json.aspx?Param=0',
                    success: function(response, options)
                    {
                        try
                        {
                            var panWestMenu = Ext.getCmp("panWestMenu");
                            if(panWestMenu)
                            {
                                var children = panWestMenu.findByType('panel');
                                if(children)
                                {
                                    for(var i=0, len = children.length; i<len; i++)
                                    {
                                        panWestMenu.remove(children[i],true);
                                    }
                                }
                            }
                            var menusArray = Ext.util.JSON.decode(response.responseText);
                           
                            for(var i=0; i<menusArray.length; i++)
                            {
                                var mp = CreateMenuPanel(menusArray[i].TypeTitle,menusArray[i].TypeID);
                                panWestMenu.add(mp);                               
                            }
                           
                            panWestMenu.doLayout();
                        }
                        catch(e)
                        {
                           
                        }
                    }
                });
            };
            loadPanelWest(); 
    }
    </script>
   
    <script type="text/javascript">
    function ready()
    {
        makeTreeMenu();       
    }
    Ext.onReady(ready);
    </script>
    </div>
    </form>
</body>
</html>
2,显示完整后台cs代码json.aspx.cs

using Ext;
using System.Collections.Generic;
using Newtonsoft.Json;

public partial class Example_TreeAutoLoad_json : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string param = Request["Param"];
        if (param == "0")
        {
            List<Ext.TreeNode> nodes = new List<Ext.TreeNode>();
            string res = "";
            try
            {
                DataSet ds = DataBusiness.GetMoreRow(Convert.ToString(param));
                if (ds != null && ds.Tables[0].Rows.Count > 0)
                {
                    for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                    {
                        DataRow row = ds.Tables[0].Rows[i] as DataRow;
                        Ext.TreeNode node = new Ext.TreeNode();
                        node.id = Convert.ToString(row["ID"]);
                        node.parentNodeId = param;
                        node.IsRoot = false;
                        node.leaf = false;
                        node.draggable = true;
                        node.text = Convert.ToString(row["TypeCName"]);
                        node.TypeID = Convert.ToString(row["ID"]);
                        node.PID = Convert.ToString(param);
                        node.TypeTitle = Convert.ToString(row["TypeCName"]);
                        node.TypeEName = Convert.ToString(row["TypeCName"]);
                        node.DelFlag = Convert.ToBoolean(row["DelFlag"]);
                        nodes.Add(node);
                    }
                }
                res = JavaScriptConvert.SerializeObject(nodes);
            }
            catch (Exception ee)
            {
                string error = ee.Message;
            }

            Response.Write(res);
        }
        else
        {
            if (Request["node"] == null || Convert.ToString(Request["node"]) == "")
                return;
            List<Ext.TreeNode> nodes = new List<Ext.TreeNode>();
            string res2 = "";
            try
            {
                DataSet ds = DataBusiness.GetMoreRow(Convert.ToString(Request["node"]));
                if (ds != null && ds.Tables[0].Rows.Count > 0)
                {
                    for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                    {
                        DataRow row = ds.Tables[0].Rows[i] as DataRow;
                        Ext.TreeNode node = new Ext.TreeNode();
                        node.id = Convert.ToString(row["ID"]);
                        node.parentNodeId = Convert.ToString(Request["node"]);
                        node.IsRoot = false;
                        node.leaf = (DataBusiness.HasChildNode(node.id));
                        node.draggable = true;
                        node.text = Convert.ToString(row["TypeCName"]);
                        node.TypeID = Convert.ToString(row["ID"]);
                        node.PID = Convert.ToString(Request["node"]);
                        node.TypeTitle = Convert.ToString(row["TypeCName"]);
                        node.TypeEName = Convert.ToString(row["TypeCName"]);
                        node.DelFlag = Convert.ToBoolean(row["DelFlag"]);
                        nodes.Add(node);
                    }
                }
                res2 = JavaScriptConvert.SerializeObject(nodes);
            }
            catch (Exception ee)
            {
                string error = ee.Message;
            }

            Response.Write(res2);
        }
    }
}
3,将涉及的实体类代码完整复制

 


namespace Ext
{
    // 摘要:
    //     Class that represents an ExtJs TreeNode
    [Serializable]
    public class TreeNode
    {
        // 摘要:
        //     Initializes a new instance of the TreeNode class.
        public TreeNode()
        {
        }

        // 摘要:
        //     Css class to render a different icon to a node
        private string _cls;
        public string cls
        {
            get { return _cls; }
            set { _cls = value; }
        }
        //
        // 摘要:
        //     If the node is draggabe
        private bool _draggable;
        public bool draggable
        {
            get { return _draggable; }
            set { _draggable = value; }
        }
        //
        // 摘要:
        //     URL of the link used for the node (defaults to #)
        private string _href;
        public string href
        {
            get { return _href; }
            set { _href = value; }
        }
        //
        // 摘要:
        //     target frame for the link
        private string _hrefTarget;
        public string hrefTarget
        {
            get { return _hrefTarget; }
            set { _hrefTarget = value; }
        }
        //
        // 摘要:
        //     The path to an icon for the node. The preferred way to do this is to use
        //     the cls or iconCls attributes and add the icon via a CSS background image.
        private string _icon;
        public string icon
        {
            get { return _icon; }
            set { _icon = value; }
        }
        //
        // 摘要:
        //     Node id
        private string _id;
        public string id
        {
            get { return _id; }
            set { _id = value; }
        }
        //
        // 摘要:
        //     If a node is checked (only if tree is checkbox tree)
        private bool _IsChecked;
        public bool IsChecked
        {
            get { return _IsChecked; }
            set { _IsChecked = value; }
        }
        //
        // 摘要:
        //     If this is the root node
        private bool _IsRoot;
        public bool IsRoot
        {
            get { return _IsRoot; }
            set { _IsRoot = value; }
        }
        //
        // 摘要:
        //     If it has children then leaf=false
        private bool _leaf;
        public bool leaf
        {
            get { return _leaf; }
            set { _leaf = value; }
        }
        //
        // 摘要:
        //     Gets or sets the type of the node.
        private string _NodeType;
        public string NodeType
        {
            get { return _NodeType; }
            set { _NodeType = value; }
        }
        //
        // 摘要:
        //     Id of the parent node
        private string _parentNodeId;
        public string parentNodeId
        {
            get { return _parentNodeId; }
            set { _parentNodeId = value; }
        }
        //
        // 摘要:
        //     Text of the node
        private string _text;
        public string text
        {
            get { return _text; }
            set { _text = value; }
        }
        private string typeID;

        public string TypeID
        {
            get { return typeID; }
            set { typeID = value; }
        }
        private string pID;

        public string PID
        {
            get { return pID; }
            set { pID = value; }
        }
        private string typeEName;

        public string TypeEName
        {
            get { return typeEName; }
            set { typeEName = value; }
        }

        private string description;

        public string Description
        {
            get { return description; }
            set { description = value; }
        }
        private string typeTitle;

        public string TypeTitle
        {
            get { return typeTitle; }
            set { typeTitle = value; }
        }

        private DateTime addDate;

        public DateTime AddDate
        {
            get { return addDate; }
            set { addDate = value; }
        }
        private bool delFlag;

        public bool DelFlag
        {
            get { return delFlag; }
            set { delFlag = value; }
        }
    }
}

4,因业务逻辑仅仅涉及2个查询较为简单,这里不再列出,仅将数据表的生成脚本完整显示

CREATE TABLE [dbo].[TypeTable](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [PID] [int] NULL,
 [TypeEName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
 [TypeCName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
 [DelFlag] [bit] NULL CONSTRAINT [DF_TypeTable_DelFlag]  DEFAULT ((0)),
 [AddDate] [datetime] NULL CONSTRAINT [DF_TypeTable_AddDate]  DEFAULT (getdate()),
 CONSTRAINT [PK_TypeTable] PRIMARY KEY CLUSTERED
(
 [ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

源代码下载

posted @ 2008-10-27 16:15 殷良胜 阅读(2649) 评论(23)  编辑 收藏 网摘

  回复  引用  查看    
#1楼[楼主]2008-10-30 13:04 | 殷良胜      
  回复  引用    
#2楼2008-11-25 11:02 | david weil1[未注册用户]
非常感谢楼主的帮助
  回复  引用    
#3楼2008-12-03 21:25 | 不落传说[未注册用户]
您好,能不能麻烦你把这个EXT系列的示例数据库发一份,总是搞不清楚树形控件的父子节点的设置,加载的树父子节点都并列的显示,实在搞不清是什么原因,能不能麻烦您发个数据库备份?
junelee1211@qq.com
不胜感激!

  回复  引用  查看    
#4楼[楼主]2008-12-04 08:46 | 殷良胜      
@不落传说
以前没有想到这方面
谢谢你的提醒
现在已经将数据库提供下载
详情请查看 本博客示例相关下载区

  回复  引用  查看    
#5楼2008-12-04 13:20 | woaibaobao      
也能把能把这段带数据库的一起发来一份呢!
10940215@163.com

  回复  引用  查看    
#6楼[楼主]2008-12-04 14:51 | 殷良胜      
@woaibaobao
老弟
要勤动手哦
后台组件也提供下载了
只要自己新建一个项目
该复制的就复制下
如果 把整个源代码都给你
即使你可以浏览效果了
那还有什么欣喜和成就感呢
你说呢

  回复  引用  查看    
#7楼2008-12-11 13:58 | jasonoiu      
LZ,这个例子中的Newtonsoft.Json命名空间从哪来的,没交待啊???

DataBusiness这个也是没说明清楚从哪来的,能不能说清楚点???

  回复  引用  查看    
#8楼2008-12-11 14:00 | jasonoiu      
LZ,我对EXT以前可是一点不知道啊,多亏有了你的基础篇和提高篇,我是一路看过来,收获非常多,能告诉我你的邮箱或者是MSN吗,有时间多向你请教!!!


我的MSN是jasonoiu@live.cn
邮箱vsajax@gmail.com

  回复  引用  查看    
#9楼[楼主]2008-12-12 08:40 | 殷良胜      
hehe
我的MSN是yinliangsheng8mchina@hotmail.com
邮箱yinliangsheng8mchina@hotmail.com

  回复  引用  查看    
#10楼[楼主]2008-12-12 08:41 | 殷良胜      
@jasonoiu
查看首页的下载区域吧

  回复  引用  查看    
#11楼2009-03-11 13:45 | 展翅翱翔      
兄弟 我按照你的代码做的,怎么连接不到数据库啊?? 树节点读不出来啊 ?? 不知道怎么回事?
谢谢指教!

  回复  引用  查看    
#12楼[楼主]2009-03-15 09:33 | 殷良胜      
@展翅翱翔
呵呵
请问更改你本地的数据库连接地址了吗?
我已经提供源代码下载,请留意。

  回复  引用  查看    
#13楼2009-03-17 16:34 | 展翅翱翔      
兄弟 数据现在读出来了!可是读出来的树结构不是我想要的那种! 郁闷中!
希望老兄给留个QQ好吗 ? 有时间交流一下! 加我的QQ还可以:253786232 谢谢了老兄!

  回复  引用  查看    
#14楼[楼主]2009-03-17 23:01 | 殷良胜      
--引用--------------------------------------------------
展翅翱翔: 兄弟 数据现在读出来了!可是读出来的树结构不是我想要的那种! 郁闷中!
希望老兄给留个QQ好吗 ? 有时间交流一下! 加我的QQ还可以:253786232 谢谢了老兄!
--------------------------------------------------------
呵呵
很抱歉 我没有qq 你有msn吗?

  回复  引用  查看    
#15楼2009-03-25 14:12 | 展翅翱翔      
我的 MSN:bj2008_zhoubo@hotmail.com 谢谢兄弟
  回复  引用  查看    
#16楼[楼主]2009-03-26 09:56 | 殷良胜      
--引用--------------------------------------------------
展翅翱翔: 我的 MSN:bj2008_zhoubo@hotmail.com 谢谢兄弟
--------------------------------------------------------
好,过几天装msn后 我加你

  回复  引用    
#17楼2009-03-29 23:26 | hushawn[未注册用户]
您好!

调试了您的代码,出现了问题,请帮忙
1。树每个节点左边的图标没出来,有一点点,没完整
2。我把您的树当作左边导航,加了伸缩属性,就是左边可以伸缩了,当我点了缩到左边后,那展开按钮就没了,导致我不能展开,我调试了下,我把您文章里的panWestMenu.add(mp); 这句注释掉就没问题。但是菜单树就出不来了
3。另外有个我自己在尝试的时候碰到了一个问题,就是屏幕中间部门是tabpanel,点左边菜单中间部分动态 添加TAB,问题是当打开第一个TAB或关闭最后一个TAB的时候中间部分会撑到底部去,把south部分都遮掉掉,有时候是往上缩,但是我把真个IE改变大小后又正常,就是双击IE标题拦。
请帮忙看看这几个问题,我是刚研究EXT,万分感激

  回复  引用  查看    
#18楼[楼主]2009-04-11 09:44 | 殷良胜      
--引用--------------------------------------------------
hushawn: 您好!

调试了您的代码,出现了问题,请帮忙
1。树每个节点左边的图标没出来,有一点点,没完整
2。我把您的树当作左边导航,加了伸缩属性,就是左边可以伸缩了,当我点了缩到左边后,那展开按钮就没了,导致我不能展开,我调试了下,我把您文章里的panWestMenu.add(mp); 这句注释掉就没问题。但是菜单树就出不来了
3。另外有个我自己在尝试的时候碰到了一个问题,就是屏幕中间部门是tabpanel,点左边菜单中间部分动态 添加TAB,问题是当打开第一个TAB或关闭最后一个TAB的时候中间部分会撑到底部去,把south部分都遮掉掉,有时候是往上缩,但是我把真个IE改变大小后又正常,就是双击IE标题拦。
请帮忙看看这几个问题,我是刚研究EXT,万分感激
--------------------------------------------------------
你好
【原】综合提高篇--有源代码下载 可以参考本例
http://www.cnblogs.com/mogen_yin/archive/2009/04/11/1433516.html" target="_new">http://www.cnblogs.com/mogen_yin/archive/2009/04/11/1433516.html

  回复  引用    
#19楼2009-05-13 14:30 | 刘liu[未注册用户]
怎么就一个面板 什么都没有呢
  回复  引用    
#20楼2009-05-26 15:23 | hiee23[未注册用户]
楼上。我跟你一样呢。!!
源码不够完整啊。最好源码能下载完。就能打开项目运行。

  回复  引用  查看    
#21楼[楼主]2009-05-26 18:00 | 殷良胜      
--引用--------------------------------------------------
hiee23: 楼上。我跟你一样呢。!!
源码不够完整啊。最好源码能下载完。就能打开项目运行。
--------------------------------------------------------
恩 以后尽量完整点 只因空间很有限 共用的代码只好分开了 下次尽量放在一起

  回复  引用    
#22楼2009-06-01 16:54 | lrxin[未注册用户]
能否给点TypeTable表中的数据
如你图中那样,列出一到两个上panel

  回复  引用  查看    
#23楼[楼主]2009-06-01 17:28 | 殷良胜      
--引用--------------------------------------------------
lrxin: 能否给点TypeTable表中的数据
如你图中那样,列出一到两个上panel
--------------------------------------------------------
下载中心有数据库呀

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1320544




相关文章:

相关链接: