Ext.Net学习笔记22:Ext.Net Tree 用法详解

Ext.Net学习笔记22:Ext.Net Tree 用法详解

上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下:

<ext:TreePanel runat="server">
    <Root>
        <ext:Node Text="根节点" Expanded="true">
            <Children>
                <ext:Node Text="节点1" Expanded="true">
                    <Children>
                        <ext:Node Text="节点11" Leaf="true"></ext:Node>
                        <ext:Node Text="节点12" Leaf="true"></ext:Node>
                    </Children>
                </ext:Node>
                <ext:Node Text="节点2" Leaf="true"></ext:Node>
                <ext:Node Text="节点3" Leaf="true"></ext:Node>
                <ext:Node Text="节点4" Leaf="true"></ext:Node>
            </Children>
        </ext:Node>
    </Root>
</ext:TreePanel>

这是一个使用标记来创建的树,我们还可以使用服务器端代码来创建,代码如下:

private void createTree()
{
    TreePanel tree = new TreePanel();
    tree.Root.Add(new Node() { Text = "根节点", Expanded = true });
    tree.Root[0].Children.Add(new Node() { Text = "节点1", Expanded = true });
    tree.Root[0].Children[0].Children.Add(new Node() { Text = "节点11", Leaf = true });
    tree.Root[0].Children[0].Children.Add(new Node() { Text = "节点12", Leaf = true });
    tree.Root[0].Children.Add(new Node() { Text = "节点2", Leaf = true });
    tree.Root[0].Children.Add(new Node() { Text = "节点3", Leaf = true });
    tree.Root[0].Children.Add(new Node() { Text = "节点4", Leaf = true });

    winTreeContainer.Add(tree);
}

异步加载树节点

在上面的代码中,我们都是一次性加载了所有节点,虽然在开发过程中比较方便,但与异步加载来说更加的耗资源,尤其是当树节点比较多的时候。

接下来让我们来构建一个异步加载的树。

<ext:TreePanel runat="server">
    <Root>
        <ext:Node Text="根节点" NodeID="root" Expanded="false">
        </ext:Node>
    </Root>
    <Store>
        <ext:TreeStore runat="server">
            <Proxy>
                <ext:AjaxProxy Url="tree-handler.ashx"></ext:AjaxProxy>
            </Proxy>
        </ext:TreeStore>
    </Store>
</ext:TreePanel>

在树的定义中南,我们为根节点添加了NodeID,然后为Tree添加了TreeStore,TreeStore通过ajax代理获取数据,获取数据的url为tree-handler.ashx处理程序,我们的处理程序代码为:

public void ProcessRequest(HttpContext context)
{
    //得到node id
    string nodeId = context.Request["node"];

    //根据node id 进行处理
    NodeCollection nodes = new NodeCollection();
    nodes.Add(new Node() { Text = "节点1" });
    nodes.Add(new Node() { Text = "节点2" });
    nodes.Add(new Node() { Text = "节点3" });
    nodes.Add(new Node() { Text = "节点4" });

    string responseString = nodes.ToJson();
    context.Response.Write(responseString);
    context.Response.End();
}

在处理方法中,最主要的是第一句,从请求中得到node id,拿到node id之后,我们可以根据node id进行子节点的获取操作,我们的代码中是为了进行演示,所以并没有获取相应子节点的操作。

如果是在MVC中,我们可以使用StoreResult来作为Action的数据返回类型。

树节点的自定义属性

通常情况下,树节点所包含的的信息并不是我们完整的数据,我们需要添加一些自定义的属性,Ext.Net为我们提供这种功能:

第一步,我们需要在TreeStore中添加一个Model,这个Model中的字段就是我们自定义的属性。

<Store>
    <ext:TreeStore runat="server">
        <Model>
            <ext:Model runat="server">
                <Fields>
                    <ext:ModelField Name="CreateUser" Type="String"></ext:ModelField>
                </Fields>
            </ext:Model>
        </Model>
        <Proxy>
            <ext:AjaxProxy Url="tree-handler.ashx"></ext:AjaxProxy>
        </Proxy>
    </ext:TreeStore>
</Store>

第二步,在生成节点的时候为我们自定义属性赋值。

public void ProcessRequest(HttpContext context)
{
    //得到node id
    string nodeId = context.Request["node"];

    //根据node id 进行处理
    NodeCollection nodes = new NodeCollection();
    var node = new Node() { Text = "节点1" };
    node.CustomAttributes.Add(new ConfigItem("CreateUser", "qeefee"));

    nodes.Add(node);

    string responseString = nodes.ToJson();
    context.Response.Write(responseString);
    context.Response.End();
}

第三步,在前台代码中使用自定义属性

我们在树的底部添加一个panel,用来显示自定义的星系,然后添加一个事件,在节点选中的时候来更新panel的显示

<DockedItems>
    <ext:Panel runat="server" Dock="Bottom" Height="30">
        <Tpl>
            <Html>
                <p>创建人:{CreateUser}</p>
            </Html>
        </Tpl>
    </ext:Panel>
</DockedItems>
<Listeners>
    <ItemClick Handler="MyApp.showDetail.call(#{treeDynamic}, record)"></ItemClick>
</Listeners>

事件的处理方法如下:

var MyApp = {
    showDetail: function (record) {
        var panel = this.getDockedItems("panel[dock=bottom]")[0];
        panel.update(record.data);
    }
};

在跟踪事件处理过程中,我们可以看到自定义属性的值:

它是和树节点的其他属性一起保存的,所以我们在使用record的时候,还可以方便的使用树节点的其他属性。

这个示例的效果图如下:

多列树(TreeGrid)

TreeGrid的效果如下图:

类似于GridPanel,有标题、多列的样式等。

又不同于GridPanel,因为它可以像树一样显示一个展开、折叠图标。

我们来看一下这个例子的代码:

<ext:TreePanel runat="server" ID="treeGrid">
    <Store>
        <ext:TreeStore ID="TreeStore1" runat="server">
            <Model>
                <ext:Model ID="Model1" runat="server">
                    <Fields>
                        <ext:ModelField Name="CreateUser" Type="String"></ext:ModelField>
                    </Fields>
                </ext:Model>
            </Model>
            <Proxy>
                <ext:AjaxProxy Url="tree-handler.ashx"></ext:AjaxProxy>
            </Proxy>
        </ext:TreeStore>
    </Store>
    <ColumnModel>
        <Columns>
            <ext:TreeColumn runat="server" Text="名称" DataIndex="text"></ext:TreeColumn>
            <ext:Column runat="server" Text="创建人" DataIndex="CreateUser"></ext:Column>
        </Columns>
    </ColumnModel>
    <Root>
        <ext:Node Text="根节点" NodeID="root" Expanded="false">
        </ext:Node>
    </Root>
</ext:TreePanel>

TreePanel的Store与之前例子相同,Root的配置也与之前的例子相同,唯一不同的是TreePanel中多了一个 ColumnModel节点,这里面的配置和GridPanel的ColumnModel相同,TreeColumn列用来显示树的列,用起来很方便。

时间: 2024-10-12 02:59:11

Ext.Net学习笔记22:Ext.Net Tree 用法详解的相关文章

算法学习笔记 KMP算法之 next 数组详解

最近回顾了下字符串匹配 KMP 算法,相对于朴素匹配算法,KMP算法核心改进就在于:待匹配串指针 i 不发生回溯,模式串指针 j 跳转到 next[j],即变为了 j = next[j]. 由此时间复杂度由朴素匹配的 O(m*n) 降到了 O(m+n), 其中模式串长度 m, 待匹配文本串长 n. 其中,比较难理解的地方就是 next 数组的求法.next 数组的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀,也可看作有限状态自动机的状态,而且从自动机的角度反而更容易推导一些. "前

Cocos2d-x学习笔记(十四)CCAutoreleasePool详解

原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38964637 前言 之前学了那么多的内容,几乎所有的控件都要涉及内存管理类CCAutoreleasePool,所以这一次的学习笔记,我们一起来看看CCAutoreleasePool,先从CCObject的autorelease方法入手. CCObject::autorelease CCObject* CCObject::autorelease(void) { // 将

Kinect学习笔记之三Kinect开发环境配置详解

0.前言: 首先说一下我的开发环境,Visual Studio是2013的,系统是win8的64位版本,SDK是Kinect for windows SDK 1.8版本.虽然前一篇博文费了半天劲,翻译了2.0SDK的新特性,但我还是决定要回退一个版本. 其实我之前一直在用2.0的SDK在调试Kinect,但无奈实验室提供的Kinect是for Windows 1.0版本的,而且Kinect从1.8之后就好像是一个分水岭,就比如win8和win7有很大的差别,2.0版的Kinect和SDK都是相较

JQuery学习笔记系列(一)----选择器详解

笔者好长时间没有更新过博客园的笔记了,一部分原因是去年刚刚开始工作一段时间忙碌的加班,体会了一种每天加班到凌晨的充实感,之后闲暇时间了也因为自己懒惰没有坚持记笔记的习惯,现在重新拾起来. 借用古人的一段话与诸君共勉: 人之为学,不日进则日退,独学无友,则孤陋而难成:久处一方,则习染而不自觉.不幸而在穷僻之域,无车马之资,犹当博学审问, 古人与稽,以求其是非之所在.庶几可得十之五六.若既不出户,又不读书,则是面墙之士,虽子羔.原宪之贤,终无济于天下. 翻译为:人们求学(或做学问),不能天天上进,就

javascript学习笔记(七):事件详解

HTML事件处理 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta chaset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <button onclick="demo()">按钮</button> 9 <scri

Node 之 Express 学习笔记 第二篇 Express 4x 骨架详解

周末,没事就来公司加班继续研究一下Express ,这也许也是单身狗的生活吧. 1.目录结构: bin, 存放启动项目的脚本文件 node_modules, 项目所有依赖的库,以及存放 package.json 中安装的模块,当你在 package.json 添加依赖的模块并安装后,存放在这个文件夹下 public,静态文件(css,js,img) routes,路由文件(MVC中的C,controller) views,页面文件(jade模板),后期打算换成 Ejs 模板搞搞 package.

iOS5 ARC学习笔记:strong、weak等详解

iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新 关键字与

深度学习笔记——PCA原理与数学推倒详解

PCA目的:这里举个例子,如果假设我有m个点,{x(1),...,x(m)},那么我要将它们存在我的内存中,或者要对着m个点进行一次机器学习,但是这m个点的维度太大了,如果要进行机器学习的话参数太多,或者说我要存在内存中会占用我的较大内存,那么我就需要对这些个点想一个办法来降低它们的维度,或者说,如果把这些点的每一个维度看成是一个特征的话,我就要减少一些特征来减少我的内存或者是减少我的训练参数.但是要减少特征或者说是减少维度,那么肯定要损失一些信息量.这就要求我在减少特征或者维度的过程当中呢,尽

Objective-C学习笔记:defer的实现方法详解

这篇文章会对 libextobjc 中的一小部分代码进行分析,也是如何扩展 Objective-C 语言系列文章的第一篇,笔者会从 libextobjc 中选择一些黑魔法进行介绍. 对 Swift 稍有了解的人都知道,defer 在 Swift 语言中是一个关键字:在 defer 代码块中的代码,会在作用域结束时执行.在这里,我们会使用一些神奇的方法在 Objective-C 中实现 defer. 如果你已经非常了解 defer 的作用,你可以跳过第一部分的内容,直接看 Variable Att