惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Cisco Blogs
爱范儿
爱范儿
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
Jina AI
Jina AI
Project Zero
Project Zero
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
Simon Willison's Weblog
Simon Willison's Weblog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tenable Blog
F
Fortinet All Blogs
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
月光博客
月光博客
雷峰网
雷峰网
G
Google Developers Blog
V
V2EX
T
Tor Project blog
罗磊的独立博客
Schneier on Security
Schneier on Security
Know Your Adversary
Know Your Adversary
W
WeLiveSecurity
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Privacy International News Feed
S
Securelist
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
小众软件
小众软件
Scott Helme
Scott Helme
I
Intezer
T
Threat Research - Cisco Blogs
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
C
CERT Recently Published Vulnerability Notes
Security Archives - TechRepublic
Security Archives - TechRepublic
酷 壳 – CoolShell
酷 壳 – CoolShell
L
LINUX DO - 最新话题
N
News | PayPal Newsroom
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Latest news
Latest news
AWS News Blog
AWS News Blog
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - 萧萧空间

Windows 2003,XP安装Windows Phone 7 从海量数据中找出中位数(转) 界面开发(五)--- 界面优化 界面开发(四)--- 还窗体的新面貌 界面开发(三)--- 设置窗体的Region 界面开发(二)--- NativeWindow 界面开发(一)--- Hook所有的窗体 界面开发概述 ExtJs之带图片的下拉列表框 寻找第K大的数的方法总结 我自己的ColorSpy Office 2010 beta版安装 Java反编译工具JD ExtJs Grid Drag Drap Splash窗体(ProgressWindowForm修改) 异步窗体实现操作进度(ProgressWindow) 线程封装组件(BackgroundWorker)和线程(Thread) 多线程开发 NSIS 的使用心得
ExtJs扩展之GroupPropertyGrid
萧萧空间 · 2010-03-05 · via 博客园 - 萧萧空间

      这几天做一个Web项目,使用了ExtJs,其中有个像设计器一样的界面,选择界面上的内容,可以直接编辑内容的属性,这个原本来说对于使用ExtJs还是很简单的。ExtJs本身就提供了丰富的空间和良好的界面开发,就如同WinForm的开发一样。但是ExtJs的空间也有不完美的地方,但是有缺点也有他自己的弥补方法。ExtJs的良好的扩展性就是ExtJs自己控件不能实现的最好的方法。

       这几个中使用最多的当属ExtJs的PropertyGrid,ExtJs的PropertyGrid使用起来时相当简单的,在ExtJs的官方网站上也有相应的例子,简单的就不在叙述了。但是ExtJs本身的PropertyGrid不能支持分组,在显示的不能将属性进行分组,这是相当郁闷的。不知道为什么ExtJs不提供这样的方法和接口。

       于是在网上Google了许久,网上也有类似的内容,叫做《扩展组件:GroupingView+ PropertyGrid (蒙牛版)》。楼主写的很好,但是不知道为什么没有将源码贴上。网上也没有其他的好的建议。无奈中,只能自己花点时间去写个吧。于是打开了ExtJs的源代码,找到了PropertyGrid的源文件,一看,还是比较简单的,

      其中几个主要内容就是:

      PropertyRecord

      PropertyStore

      PropertyColumnModel

      PropertyGrid

      于是拷贝了全部的源代码,创建了文件名为Ext.ux.grid.GroupPropertyGrid.js的脚本文件,并测试值,成功通过,开始阅读PropertyGrid的源代码,发现了以下几个问题:

      1、PropertyRecord这个种的内容太少了,仅有name和value,

      2、PropertyStore使用的是Ext.data.Store,而没有使用Ext.data.GroupingStore

      3、PropertyStore使用的数据中不支持分组,并且更新的时候没有对分组进行处理

     而PropertyGrid确实继承EditorGridPanel,这个本身就是可以支持Group分组的,这样PropertyGrid中就不需要修改了。

     下面就对这几个问题进行修改,让他支持分组:

     1、修改PropertyRecord,添加Group字段。

1 Ext.ux.grid.GroupPropertyRecord=Ext.data.Record.create(
2     [{name:"name",type:"string"},"value","group"]
3 );

     2、修改PropertyStore以支持GroupingStore

 1 Ext.ux.grid.GroupPropertyStore = function(grid, source){
 2     this.grid = grid;
 3     this.store = new Ext.data.GroupingStore({
 4         recordType : Ext.ux.grid.GroupPropertyRecord,
 5         groupField : "group"
 6     });
 7     this.store.on('update'this.onUpdate,  this);
 8     if(source){
 9         this.setSource(source);
10     }
11     Ext.ux.grid.GroupPropertyStore.superclass.constructor.call(this);
12 };
13 Ext.extend(Ext.ux.grid.GroupPropertyStore, Ext.util.Observable, {
14     setSource : function(o){
15         this.source = o;
16         this.store.removeAll();
17         var data = [];
18         for(var k in o){
19             if(this.isEditableValue(o[k])){
20                 data.push(new Ext.ux.grid.GroupPropertyRecord({name: k, value: o[k],group:k},k));
21             }
22             else if(typeof(o[k]) == 'object'){
23                 for(var n in o[k]){
24                     data.push(new Ext.ux.grid.GroupPropertyRecord({name: n, value: o[k][n],group:k},k+"&&"+n));
25                 }
26             }
27         }
28         this.store.loadRecords({records: data}, {}, true);
29     },
30 
31     // private
32     onUpdate : function(ds, record, type){
33         if(type == Ext.data.Record.EDIT){
34             var v = record.data['value'];
35             var oldValue = record.modified['value'];
36             if(this.grid.fireEvent('beforepropertychange'this.source, record.id, v, oldValue) !== false){
37                 if(record.id.indexOf("&&")!=-1)
38                 {
39                     var values = record.id.split("&&");
40                     this.source[values[0]][values[1]] = v;
41                 }
42                 else
43                 {
44                     this.source[record.id] = v;
45                 }
46                 record.commit();
47                 this.grid.fireEvent('propertychange'this.source, record.id, v, oldValue);
48             }else{
49                 record.reject();
50             }
51         }
52     },
53 
54     // private
55     getProperty : function(row){
56        return this.store.getAt(row);
57     },
58 
59     // private
60     isEditableValue: function(val){
61         if(Ext.isDate(val)){
62             return true;
63         }else if(typeof val == 'object' || typeof val == 'function'){
64             return false;
65         }
66         return true;
67     },
68 
69     // private
70     setValue : function(prop, value){
71         this.source[prop] = value;
72         this.store.getById(prop).set('value', value);
73     },
74 
75     // protected - should only be called by the grid.  Use grid.getSource instead.
76     getSource : function(){
77         return this.source;
78     }
79 });

      主要修改了SetSource,onUpdate这两个方法,并且修改了Store为GroupingStore。这样在去测试,就成功的可以看到PropertyGrid已经可以分组了。效果图如下:

     

      这样整个工作就完成了。

      全部的源代码下载:/Files/zhjp11/GroupPropertyGrid.rar