`
lidg
  • 浏览: 5102 次
社区版块
存档分类
最新评论

修改EditorGridPanel让它支持Lookup效果

    博客分类:
  • Ext
EXT 
阅读更多
记得Dephi里有一个叫Lookup效果的Grid(不知道是不是这种叫法),就是如何在Grid中显示或编辑代码数据项,下面就是Ext的实现
希望对有这种需求的同学有所帮助。
一、重写Ext.grid.GridEditor让Editor控件获得Grid的当前行数据,代码如下,大家可以对照原来Ext.grid.GridEditor的源码
Ext.grid.GridEditor = function(field, config){
    Ext.grid.GridEditor.superclass.constructor.call(this, field, config);
    field.monitorTab = false;
};

Ext.extend(Ext.grid.GridEditor, Ext.Editor, {
    alignment: "tl-tl",
    autoSize: "width",
    hideEl : false,
    cls: "x-small-editor x-grid-editor",
    shim:false,
    shadow:false,
    //从Editor.js中拷贝过来
    startEdit : function(el, value){
        if(this.editing){
            this.completeEdit();
        }
        this.boundEl = Ext.get(el);
        var v = value !== undefined ? value : this.boundEl.dom.innerHTML;
        if(!this.rendered){
            this.render(this.parentEl || document.body);
        }
        if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){
            return;
        }
        this.startValue = v;
        this.field.record = this.record;//就加入这一行,让field中获得当前数据行
        this.field.setValue(v);
        this.doAutoSize();
        this.el.alignTo(this.boundEl, this.alignment);
        this.editing = true;
        this.show();
    }
});

二、继承Ext.form.ComboBox,让combo在设置值时把代码值写到Grid当前行的代码数据项中:
Ext.form.LookupComboBox = Ext.extend(Ext.form.ComboBox, {
setValue:function (v) {
	var text = v;
	var lookupValue;
	//增加的代码
	if (this.codeField) {
		var r = this.findRecord(this.displayField, v);
		if (r) {
			lookupValue = r.data[this.codeField];
		} else {
			if (this.valueNotFoundText !== undefined) {
				lookupValue = this.valueNotFoundText;
			}
		}
	}
	if (this.record&&lookupValue) {
		this.record.set(this.lookup, lookupValue);//把代码值写到Grid当前行数据中的代码项目字段
	}
	//增加的代码 --end
	this.lastSelectionText = text;
        if(this.hiddenField){
            this.hiddenField.value = v;
        }
        Ext.form.ComboBox.superclass.setValue.call(this, text);
        this.value = v;
}});

三、使用:如下代码,附件有完整的例子,下载解压到ext的examples\grid文件夹中可以运行.
//查帐信息
var itemTypeStore = new Ext.data.SimpleStore({
        fields: ['code','name'],
        data : [['100','流动资产'],['101','固定资产']]
    });
var insureModeStore = new Ext.data.SimpleStore({
        fields: ['code','name'],
        data : [['100','账面原值'],['101','原值加成'],['102','账面余额'],['103','余额加成'],['104','清单'],['105','估价'],['106','账面净值'],['107','其他']]
 	});
var currencySystemStore = new Ext.data.SimpleStore({
        fields: ['code','name'],
        data : [['0110001','美元'],['0110002','英镑'],['0110003','港币'],['0110004','人民币']]	
 	}); 	    
   
var Plant = Ext.data.Record.create([
        {name:'id',type:'int'},
		{name:'surveyId',type:'int'},
		{name:'itemType',type:'string'},
		{name:'itemName',type:'string'},
		{name:'insureMode',type:'string'},
		{name:'currencySystem',type:'string'},
		{name:'insuredAmount',type:'float'},
		{name:'spotPrice',type:'float'},
		{name:'desc',type:'string'}
      ]); 
var auditReader = new Ext.data.JsonReader({
        idProperty:'id',
        fields: [
									{name:'id',type:'int'},
									{name:'surveyId',type:'int'},
										'itemType','itemName','insureMode','currencySystem','desc',
										'insureModeName','itemTypeName','currencySystemName',
									{name:'insuredAmount',type:'float'},
									{name:'spotPrice',type:'float'},
									{name:'inAccountTime',type:'date',format:'Y-m-d H:i'}
		]
    });         

var auditStore = new Ext.data.Store({
				data: xg.dummyData,
				reader: reader,
				remoteSort: true
			});        
var auditsm = new xg.RowNumberer();
var auditcm = new xg.ColumnModel([
		auditsm,
		{id:'id',hidden: true,dataIndex:'id',sortable: false},
		{header:'项目类型代码',hidden:true,dataIndex:'itemType',sortable: false},
		//下面是代码的lookup字段,
		{header: '项目类型', width: 100,dataIndex: 'itemTypeName',sortable: false,
		 renderer: function(v, params, record){
		 //根据项目类型字段的值找代码数据中它的应名称,并显示出来,就可以实现lookup效果了
			return findRecordValue(itemTypeStore,'code',record.data['itemType'],'name');
		}, 
		//加入LookupComboBox,实现lookup的编辑效果
		 editor: new Ext.form.LookupComboBox({
        			store: itemTypeStore,
        			codeField:'code',
        			displayField:'name',
        			lookup:'itemType',
        			typeAhead: true,
        			mode: 'local',
        			triggerAction: 'all',
        			emptyText:'--请选择--',
        			selectOnFocus:true
    			}) 
		 },
		{header: '项目名称', width: 100,dataIndex: 'itemName',sortable: false,
		 editor: new Ext.form.TextField({
                   allowBlank: false
                })
		},
		{header: '投保方式', width: 100,dataIndex: 'insureModeName',sortable: false,
		renderer: function(v, params, record){
			return findRecordValue(insureModeStore,'code',record.data['insureMode'],'name');
		},
		 editor: new Ext.form.LookupComboBox({
        			store: insureModeStore,
        			codeField:'code',
        			displayField:'name',
        			lookup:'insureMode',
        			typeAhead: true,
        			mode: 'local',
        			triggerAction: 'all',
        			emptyText:'--请选择--',
        			selectOnFocus:true
    			})
		},
		{header:'投保方式代码',hidden: true,dataIndex:'insureMode',sortable: false},
		{header: '投保时金额',renderer: Ext.util.Format.money,width: 100,dataIndex: 'insuredAmount',sortable: false,
		 editor: new Ext.form.NumberField({
                    allowBlank: false,
                    allowNegative: false,
                    style: 'text-align:left'
                })
		},
		{header: '出险时金额',renderer: Ext.util.Format.money,width: 80,dataIndex:'spotPrice',sortable: false,
		 editor: new Ext.form.NumberField({
                    allowBlank: false,
                    allowNegative: false,
                    style: 'text-align:left'
                })
		},
		{header:'项目币种代码',hidden:true,dataIndex:'currencySystem',sortable:false},
		{header: '项目币种', width: 60,dataIndex:'currencySystemName',sortable: false,
		renderer: function(v, params, record){
			return findRecordValue(currencySystemStore,'code',record.data['currencySystem'],'name');
		},
		 editor: new Ext.form.LookupComboBox({
        			store: currencySystemStore,
        			codeField:'code',
        			displayField:'name',
        			lookup:'currencySystem',
        			typeAhead: true,
        			mode: 'local',
        			triggerAction: 'all',
        			emptyText:'--请选择--',
        			selectOnFocus:true
    			})
		},
		{header: '入帐时间', width: 90,dataIndex:'inAccountTime',sortable: false,
		 renderer: Ext.util.Format.dateRenderer('Y-m-d H:i'),
		 editor: new Ext.form.DateField({format:'Y-m-d H:i',menu:new DatetimeMenu()})
		},
		{header:'说明',width:120,dataIndex:'desc',sortable: false,
		 editor:new Ext.form.TextArea()
		}
		]);
auditcm.defaultSortable = true;
var auditInfoGrid = new xg.EditorGridPanel({
	title:'查帐信息',
	iconCls:'icon-grid',
	store: auditStore,
    cm: auditcm,
    loadMask: true,
    bodyStyle:'width:100%',
    border:false,
    frame:true,
    clicksToEdit:1,
    renderTo: document.body,
    viewConfig: {forceFit:true},
        tbar:[{text:'增加',tooltip:'增加查帐信息',iconCls:'add',handler : function(){
        		var plan = new Plant({id:0,surveyId:20,itemType:'',itemName:'',insureMode:'',currencySystem:''});
        		auditStore.commitChanges();
        		var count = auditStore.getCount(); 
        		auditStore.insert(count,plan);
        		auditInfoGrid.startEditing(count, 0);
        		}
        	 }, 
        	'-', 
        	{text:'删除',tooltip:'删除查帐信息',iconCls:'remove',handler:function(){alert(Ext.util.Format.date(auditStore.getAt(0).data.inAccountTime,'Y-m-d H:i'));}}
        ]
});
auditStore.load();
Ext.grid.dummyData = [{id:1,surveyId:20,itemType:'100',itemName:'电脑设备',desc:'革命同志',insureMode:'100',currencySystem:'0110004',insuredAmount:1000.00,spotPrice:8900.00,inAccountTime:'Fri Aug 15 11:18:07 CST 2008'}];

  • 描述: 效果图
  • 大小: 30.2 KB
  • lookup.rar (7.4 KB)
  • 描述: 例子源码
  • 下载次数: 251
分享到:
评论

相关推荐

    Extjs可编辑的EditorGridPanel

    NULL 博文链接:https://zxf-noimp.iteye.com/blog/629629

    可编辑表格Ext.grid.EditorGridPanel

    3. 提交更改:编辑完成后,EditorGridPanel会触发相应的事件,如afteredit,开发者可以通过监听这些事件来处理数据更新。 四、使用步骤 1. 创建Store:定义数据模型并加载数据。 2. 定义列模型:配置每列的字段名、...

    解决editorgridpanel编辑时视图向右移动的问题

    EditorGridPanel是Ext JS库中的一个组件,它结合了数据网格和表单编辑的功能,允许用户直接在网格的单元格内编辑数据。当用户点击某个单元格进行编辑时,编辑器应该在原单元格位置弹出,但有时由于某种原因,整个...

    Ext可编辑的tree,EditorGridPanel

    因为项目的需求,实现一个可以编辑的tree,在网上找了一个牛人写的控件.Ext.ux.maximgb.tg.EditorGridPanel 把源码下载下来以后 不能运行,自己根据给出的列子,另写了一个小程序.不过并没有与数据库交互.

    Extjs EditorGridPanel中ComboBox列的显示问题

    在EXTJS中,EditorGridPanel是一种可编辑的表格组件,它允许用户直接在表格单元格内编辑数据。然而,当在EditorGridPanel中嵌入ComboBox(下拉选择框)作为编辑器时,可能会遇到一个问题,即ComboBox显示的不是其...

    Ext.grid.GridPanel右键菜单

    右键菜单的资料,代码已经详细描写。请仿照文件中所描述即可使用,不限于EXT4.0以上版本使用。

    ext 读取xml 可编辑grid

    在EXT JS框架中,"ext 读取xml 可编辑grid"是一个常见的需求,涉及到的主要知识点包括EXT的数据对象、EditorGridPanel的使用以及EXT对XML数据格式的支持。下面将详细阐述这些内容。 EXT JS是一个强大的JavaScript库...

    Ext TreePanel

    编辑时,`EditorGridPanel`会使用这些编辑器来控制用户的输入,并在用户完成编辑后将更改应用到原始数据。此外,确保在提交数据到服务器之前进行有效性验证是至关重要的,因为这可以防止无效或错误的数据被保存。 ...

    ExtJS2.0实用简明教程

    `EditorGridPanel`是GridPanel的一个扩展,它允许用户直接在表格单元格内编辑数据。这对于数据录入和管理非常有用,可以结合各种编辑器实现复杂的数据输入需求。 **九、Ext类库简介** ExtJS2.0的类库包括许多预定义...

    ExtJS使用笔记

    Ext.grid.EditorGridPanel还支持手工操作以及通过DataWriter自动进行数据的CRUD操作。 Ext.tree.TreePanel组件用于展示树状结构的数据,可以构建静态的树结构,也可以动态地从服务器加载数据构建树。TreePanel提供...

    Ext组件说明 Ext组件概述

    它通常与Ext的数据存储组件一起使用,以提供更复杂的数据显示效果。 ##### 6. **DatePicker(日期选择器)** DatePicker组件提供了一个直观的界面来选择日期。它包括一个日历弹出窗口,支持多种日期格式和范围限制...

    GridPanel属性详解

    最后,让我们了解一下`Ext.grid.ColumnModel`的关键配置项: 1. **columns** - **描述**:一个列配置数组,每个元素都是一个`Column`配置对象。 2. **defaultSortable/defaultWidth** - **描述**:分别控制...

    extjs扩展标记

    - **EditorGridPanel**:在GridPanel的基础上增加了单元格编辑功能,可以直接在表格中修改数据。 - **TabPanel**:用于组织多个视图,每个视图都可以在一个标签页中展示。 - **FormPanel**:用于创建各种表单...

    Ext表格控件和树控件

    在这个例子中,`EditorGridPanel` 提供了对每个单元格的编辑功能,并且还增加了一个工具栏按钮来保存所有的更改。 #### 数据存储器 `Store` 数据存储器是 `GridPanel` 和 `EditorGridPanel` 必不可少的一部分。它...

    老师整理的extjs学习笔记

    它支持从多种数据源获取数据,并提供了数据的排序、过滤等功能。 **7.2 Ext.data.DataProxy -- Ext.data.Store 的数据获取器** `Ext.data.DataProxy` 是 `Ext.data.Store` 的一部分,负责从数据源获取数据。常见的...

    treePanel与gridPanel技术实现页面的增删改查

    - GridPanel的编辑功能通常通过`EditorGridPanel`实现,允许用户直接在单元格内进行修改,支持单行编辑和多行编辑模式。 3. **增删改查实现**: - 增加:在TreePanel中,可以创建新的子节点;在GridPanel中,通常...

    Ext 3.2的一个TreeGrid

    感谢 Ericzhen 远离颠倒梦想,蕴籍无上清凉 这里引用它的资源 仅作分享 http://www.cnblogs.com/Ericzhen/archive/2012/06/11/2545186.html

    ExtJs2.0简明教程

    它支持分页、排序、过滤等功能,并且可以通过配置项来自定义列和数据源。 #### 7.2 可编辑的表格EditorGridPanel EditorGridPanel是一种特殊的GridPanel,它允许用户直接在表格中编辑数据。这对于需要频繁更新数据...

Global site tag (gtag.js) - Google Analytics