zoukankan      html  css  js  c++  java
  • Coolite TreePanel开发实例

    Coolite TreePanel开发实例 包括功能(右击菜单,筛选菜单,拖动菜单)

     

    在博客园也待了很久,一直有想法想发表几篇文章,毕竟在这里获得了太多的知识,也得把自己学习到的东西来分享给大家。但是由于本人技术不咋的,文笔也不咋的,迟迟不敢写。但是,今天还是迈出这第一步吧!如果写的不好,请各位见谅下,也请大家多提下意见,谢谢!

    最近在做一个权限管理平台,主要针对公司各系统进行权限控制,如果说各位有谁有做这方面的经验的话,可以来一起探讨下哦!这个平台就是用COOLITE来开发的,关于COOLITE这方面大家可以百度下,也可以到官方看下http://www.ext.net/。东西挺不错的,就是引用文件有点大,这是我在最纠结的问题。

           好了,言归正传了!先上图给大家看下TreePanel 的效果

     

    相信大家也看到图了,下来我将分别贴出每个功能的代码,并做一定的说明。

    现在具体功能详细说明下:

    1.动态加载树: 

      <ext:TreePanel ID="TreePanel1" runat="server" AutoShow="true" Header="false" AutoHeight="true"

    复制代码
                    AutoScroll="true" Animate="true" EnableDD="true" ContainerScroll="true" Border="false" 
                    
    >
                    <Listeners>
                        <BeforeLoad Fn="nodeLoad" />
                    </Listeners>
                    <Root>
                        <ext:AsyncTreeNode NodeID="0" Text="菜单" Icon="House" />
                    </Root>
                </ext:TreePanel>
    复制代码
    复制代码
        ///加载菜单
            function nodeLoad(node) {
                Ext.net.DirectMethods.NodeLoad(node.id, {
                    success: function (result) {
                        var data = eval("(" + result + ")");
                        node.loadNodes(data);
                    },

                    failure: function (errorMsg) {
                        Ext.Msg.alert('Failure', errorMsg);
                    }
                });
            }
    复制代码

               /// <summary>

    复制代码
            /// 菜单加载
            
    /// </summary>
            
    /// <param name="nodeID"></param>
            
    /// <returns></returns>
            [DirectMethod]
            public static string NodeLoad(string nodeID)
            {

            }

    复制代码

    在动态创建菜单这部分主要在调用JS方法<Listeners><BeforeLoad Fn="nodeLoad"/></Listeners>, 再由JS调用后台方法,获取JSON显示!菜单的加载不是一次将所有都加载出来的,而是根据你点击菜单后才绑定。 

    2.拖动菜单。

    先上图: 

    首先在TreePanel中以下代码:

      <Listeners>
             <MoveNode Fn="moveNode" />

      </Listeners> 

          //移动菜单

    复制代码
            var moveNode = function (tree, node, oldParent, newParent, index) {
                var nodeid = node.id;
                var newnodeid = newParent.id;
                Ext.net.DirectMethods.DragNode(nodeid, newnodeid);

            }
    复制代码

     主要实现是以上2段代码,调用后台的DragNode来保存。

    3.筛选菜单。  <TopBar>

    复制代码
                        <ext:Toolbar ID="Toolbar1" runat="server">
                            <Items>
                                <ext:ToolbarTextItem ID="ToolbarTextItem1" runat="server" Text="筛选:" />
                                <ext:ToolbarSpacer />
                                <ext:TriggerField ID="TriggerField1" runat="server" EnableKeyEvents="true">
                                    <Triggers>
                                        <ext:FieldTrigger Icon="Clear" />
                                    </Triggers>
                                    <Listeners>
                                        <KeyUp Fn="filterTree" Buffer="250" />
                                        <TriggerClick Handler="clearFilter();" />
                                    </Listeners>
                                </ext:TriggerField>
                              
                            </Items>
                        </ext:Toolbar>
    复制代码

                    </TopBar> 

    复制代码
      ///筛选菜单
            var filterTree = function (el, e) {
                var tree = TreePanel1,
                    text = this.getRawValue();
                tree.clearFilter();
                if (Ext.isEmpty(text, false)) {
                    return;
                }
                if (e.getKey() === Ext.EventObject.ESC) {
                    clearFilter();
                } else {
                    var re = new RegExp(".*" + text + ".*", "i");

                    tree.filterBy(function (node) {
                        return re.test(node.text);
                    });
                }
            };
            var clearFilter = function () {
                var field = TriggerField1,
                    tree = TreePanel1;
                field.setValue("");
                tree.clearFilter();
                tree.getRootNode().collapseChildNodes(true);
                tree.getRootNode().ensureVisible();
            };
    复制代码

     筛选添加以上的2段代码就可以实现了。

    4,右键功能菜单。 

       <ext:Menu ID="cmenu" runat="server">

    复制代码
            <Items>
                <ext:MenuItem ID="copyItems" runat="server" Text="添加节点" Icon="Add">
                    <Listeners>
                        <Click Handler="#{win_Menu}.show();#{hid_NodeId}.setValue(this.parentMenu.node.id);#{hid_type}.setValue('add')" />
                    </Listeners>
                </ext:MenuItem>
                <ext:MenuItem ID="editItems" runat="server" Text="修改节点" Icon="BulletEdit">
                    <Listeners>
                        <Click Handler="#{win_Menu}.show();#{hid_NodeId}.setValue(this.parentMenu.node.id);#{hid_type}.setValue('edit')" />
                    </Listeners>
                </ext:MenuItem>
                <ext:MenuItem ID="moveItems" runat="server" Text="删除节点" Icon="Delete">
                    <Listeners>
                        <Click Handler="Ext.net.DirectMethods.DeleteMenu(this.parentMenu.node.text);#{hid_NodeId}.setValue(this.parentMenu.node.id);" />
                    </Listeners>
                </ext:MenuItem>
                <ext:MenuItem ID="openItems" runat="server" Text="启用节点" Icon="StopBlue">
                    <Listeners>
                        <Click Handler="Ext.net.DirectMethods.OpenMenu(this.parentMenu.node.text,'Open');#{hid_NodeId}.setValue(this.parentMenu.node.id);#{hid_type}.setValue('Open')" />
                    </Listeners>
                </ext:MenuItem>
                <ext:MenuItem ID="closeItems" runat="server" Text="关闭节点" Icon="Stop">
                    <Listeners>
                        <Click Handler="Ext.net.DirectMethods.OpenMenu(this.parentMenu.node.text,'Close');#{hid_NodeId}.setValue(this.parentMenu.node.id);#{hid_type}.setValue('Close')" />
                    </Listeners>
                </ext:MenuItem>
            </Items>
        </ext:Menu>
    复制代码

     在这里都是使用COOLITE的异步调用。

      <Listeners> 

                        <ContextMenu Handler=" #{cmenu}.node=node;#{cmenu}.showAt(e.getPoint());"/>


                    </Listeners>

     右键功能菜单调用<ContextMenu  Handler=" #{cmenu}.node=node;#{cmenu}.showAt(e.getPoint());" />

    在新增跟修改的时候,有弹出窗口,我将代码给发给大家吧!

    复制代码
    <ext:Window ID="win_Menu" runat="server" Resizable="false" Height="365" Icon="Lock"
            Title
    ="节点管理" Draggable="true" Width="400" Modal="true" Padding="5" Hidden="true"
            Closable
    ="false" Layout="Form">
            <DirectEvents>
                <Show OnEvent="win_Menu_Show">
                </Show>
            </DirectEvents>
            <Items>
                <ext:FormPanel ID="FormPanel1" runat="server" BodyStyle="padding:1px;" ButtonAlign="Center"
                    Frame
    ="true" BodyBorder="false" MonitorValid="true" Header="false" Layout="Form">
                    <Items>
                        <ext:TextField ID="txt_MenuName" runat="server" FieldLabel="节点名称" AnchorHorizontal="98%"
                            AllowBlank
    ="false" BlankText="节点名称不能为空!" EmptyText="请输入节点名称..." />
                        <ext:RadioGroup ID="RadioGroup1" runat="server" FieldLabel="启用">
                            <Items>
                                <ext:Radio ID="IsEnable_yes" runat="server" BoxLabel="是" Checked="true" />
                                <ext:Radio ID="IsEnable_no" runat="server" BoxLabel="否" />
                            </Items>
                        </ext:RadioGroup>
                        <ext:TextField ID="txt_MenuUrl" runat="server" FieldLabel="URL" AllowBlank="false"
                            AnchorHorizontal
    ="98%" BlankText="节点URL不能为空!" EmptyText="请输入节点URL..." />
                        <ext:RadioGroup ID="RadioGroup3" runat="server" FieldLabel="打开模式">
                            <Items>
                                <ext:Radio ID="mode_no" runat="server" BoxLabel="无" Checked="true" />
                                <ext:Radio ID="mode_this" runat="server" BoxLabel="自身" />
                                <ext:Radio ID="mode_new" runat="server" BoxLabel="新窗口" />
                            </Items>
                        </ext:RadioGroup>
                        <ext:TextArea runat="server" ID="txt_MenuRemark" FieldLabel="说明" AnchorHorizontal="98%"
                            Height
    ="150">
                        </ext:TextArea>
                    </Items>
                </ext:FormPanel>
            </Items>
            <Buttons>
                <ext:Button ID="btn_Save" runat="server" Text="确定" Icon="Accept">
                    <Listeners>
                        <Click Handler="if(!#{txt_MenuName}.validate() || !#{txt_MenuUrl}.validate() ) {
                                    Ext.Msg.alert('提示','请填写表单中必填部分!');
                                    return false;
                                }"
     />
                    </Listeners>
                    <DirectEvents>
                        <Click OnEvent="btn_Save_Click" Success="#{FormPanel1}.getForm().reset();#{win_Menu}.hide(null);">
                        </Click>
                    </DirectEvents>
                </ext:Button>
                <ext:Button ID="Button4" runat="server" Text="取消" Icon="Cancel">
                    <Listeners>
                        <Click Handler="#{FormPanel1}.getForm().reset();#{win_Menu}.hide(null);" />
                    </Listeners>
                </ext:Button>
            </Buttons>
    复制代码

        </ext:Window>

    大概也就这样了,实现的必须代码都发给大家了,实际的后台进行增加什么的我也就不说明了。

    有几点说明:拖拉的时候,在后台动态创建菜单的时候TreeNode 的Draggable = false,Expanded = true;

    要刷新菜单的话,可以使用这句代码 X.AddScript(TreePanel1.ClientID + ".root.reload();"); 

    第一次写有点乱,希望大家见谅下!!如果有什么问题可以给我留言,或者发邮件hyaoxin@vip.qq.com!

  • 相关阅读:
    斯托克斯定理(Stokes' theorem)
    记号的认识、公式的理解
    记号的认识、公式的理解
    Python 金融数据分析 (一)—— 股票数据
    Python 金融数据分析 (一)—— 股票数据
    开源项目
    开源项目
    感知机模型及其对偶形式
    感知机模型及其对偶形式
    jni编译non-numeric second argument to `wordlist' function错误
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2593427.html
Copyright © 2011-2022 走看看