1.       需求说明:

在domino开发中我们经常会遇到表单上需要一个类似table的组件,你可以增删改等。比如我有一个张报核单据,上面需要详细列出每项金额的明细,我们先看完成后的效果:

上面的图就是我用extjs完成的。

2.       功能介绍

这个grid组件可以完成增加,删除,插入,修改,排序等功能。每项功能的操作都只是针对grid,不需要额外的FormPanel。双击单元格就可以修改。

3.       如何使用

这个组件我做的尽可能通用,由于是专门为domino平台定制,grid中的数据均存储在notes的多值域中。使用这个gird组件,你需要提供以下几个数组:

(1):多值域名的数组(第一列对应的序号多值域的名字必须为Seq)

(2):gird title显示文字的数组

(3):每个列对应的编辑单元格时需要的Ext对应组件的名称,如果你这个组件为ComboBox,那么你需要在提供一个数组,在数组的对应位置存储你要在ComboBox中显示的内容。

4.注意问题:

1.Ext中DateField实际你取出值存到多值域的时候是一个UTC的时间。如果你在新的系统中使用该组件,这个没有问题。由于我的系统原来的多值域存储的时间为“2009-08-08”类似形式,这样在显示的时候就无法识别了。

2.组件的校验实际上就是Ext各个form组件的校验,这个要根据不同系统的业务来处理。

3.权限控制,在domino中的系统中工作流居多,不同的流程条件下需要有权限控制,这个有两种方案,

方案一:根据不同条件对grid的列是否设置Editor属性,并控制按钮的属性。

方案二:由于grid是呈现在表单上的div元素,可以控制该div的隐藏条件,然后根据是否能取得到div dom来判断去实例不同的grid。

由于在domino中js和表单的交互不是很方便,我选择方案二。

4. 7.关于编号的维护只维护新增,插入时,删除时不维护。

5.程序介绍

5.1.三个公用的函数如下:

1.   将多值域转换为数组返回

2.   多数组进行增,删,插入

3.   根据不同的类型去实例化不同的Ext组件

function CoToArray(name)

{
     var arrName=new Array();

if(Ext.getDom(name).value!="")

{

arrName=Ext.getDom(name).value.split(";");

}

return arrName;

}

//0:add,1:delete,2:insert

function OpMultiFieldArray(arrName,type,index,value)

{
     for(i=0;i<arrName.length;i++)

{

var arrOpArray=CoToArray(arrName[i])

switch (type)

{

case 0:

if(0==i)

arrOpArray.push(value-1);

else

arrOpArray.push("");

break;

case 1:

arrOpArray.splice(index,1);

break;

case 2:

if(0==i)

arrOpArray.splice(index,0,value);

else

arrOpArray.splice(index,0,"");

break;

}

Ext.getDom(arrName[i]).value=arrOpArray.join(";");

}

}

function EditorCM(type)

{

var editorCM;

switch (type)

{

case "Read":

editorCM=null;

break;

case "TextField":

editorCM=new Ext.form.TextField();

break;

case "DateField":

editorCM=new Ext.form.DateField(

{format: 'Y-m-d'});

break;

case "TimeField":

editorCM=new Ext.form.TimeField();

break;

case "ComboBox":

editorCM=new Ext.form.ComboBox();

break;

case "NumberField":

editorCM=new Ext.form.NumberField();

break;

}

return editorCM;

}

5.2.下面是Ext.onReady部分:

Ext.onReady(function(){

//需要用户指定的程序部分

var arrName=new Array("Seq","Loc","ODate","OTime","ExType","Cur","Fees","RMBFees","FFees","Memo");

var arrTitleName=new Array("序号","发生地点","发生日期","发生时间","费用别","币别","原币金额","审核金额","人民币金额","摘要说明");

var arrTypeName=new Array("Read","TextField","DateField","TimeField","ComboBox","ComboBox","NumberField","NumberField","NumberField","TextField");

var cmbStore=['交通费','膳杂费','其他'];

var cmbMoStore=['RMB','USD','TWD'];

var arrCmbStore=new Array();

arrCmbStore[4]=cmbStore;

arrCmbStore[5]=cmbMoStore;

//-----construct the read colunm of grid

var arrColMRead=new Array();

for(var k=0;k<arrName.length;k++)

{

arrColMRead[k]={header:arrTitleName[k],  dataIndex: arrName[k], sortable: true};

}

var colMRead=new Ext.grid.ColumnModel(arrColMRead);

//-----end construct the read colunm of grid

//----- construct the edit colunm of grid

var sm = new Ext.grid.CheckboxSelectionModel();

var arrColM=new Array();

for(var k=0;k<=arrName.length;k++)

{

if(k==0)

{

arrColM[k]=sm;

}

else

{

if(arrTypeName[k-1]=="ComboBox")

{

arrColM[k]={header:arrTitleName[k-1],  dataIndex: arrName[k-1], sortable: true,editor:new Ext.form.ComboBox(

{store:arrCmbStore[k-1],

displayField:'state',

typeAhead: true,

mode: 'local',

forceSelection: true,

triggerAction: 'all',

emptyText:'Select a state...',

selectOnFocus:true,

y:30})};

}

else if(arrTypeName[k-1]=="DateField")

{

arrColM[k]={header:arrTitleName[k-1],  dataIndex: arrName[k-1], sortable: true,renderer:Ext.util.Format.dateRenderer('Y-m-d'),editor:EditorCM(arrTypeName[k-1])};

}

else

{

arrColM[k]={header:arrTitleName[k-1],  dataIndex: arrName[k-1], sortable: true,editor:EditorCM(arrTypeName[k-1])};

}

}

}

var colM=new Ext.grid.ColumnModel(arrColM);

//-----end construct the edit colunm of grid

// create the Data Store

var strData= new Array();

if(CoToArray(arrName[0])!="")

{

for (i=0;i<CoToArray(arrName[0]).length ;i++ )

{

strData[i]=new Array();

for(var j=0;j<arrName.length;j++)

{

strData[i][j]=CoToArray(arrName[j])[i]

}

}

}

var store1=new Ext.data.SimpleStore(

{data:strData,

autoLoad:true,

fields:arrName

});

// create the read grid

if(Ext.getDom("grid")!=null)

{

var grid = new Ext.grid.GridPanel({

store: store1,

renderTo:"grid",

cm:colMRead,

width:1220,

header:true,

height:200

});

}

//---begin grid1

if(Ext.getDom("grid1")!=null)

{

var grid1 = new Ext.grid.EditorGridPanel({

renderTo:"grid1",

title:"可编辑的增删改组件",

height:300,

width:1230,

sm:sm,

cm:colM,

store:store1,

//autoExpandColumn:10,

listeners: {

//修改部分会更新域

afteredit: function(e) {

var arrObj= CoToArray(e.field);

arrObj[e.row]=e.value;

Ext.getDom(e.field).value=arrObj.join(";");

} ,

beforeedit:function(e){

},

validateedit:function(e){

}
     }

});

}

//---end grid1

//-------add1 button click

if(Ext.getDom('Add1')!=null)

{

var button = Ext.get('Add1');

var win;

button.on('click', function(){

var re=new Ext.data.Record(

{

Seq:grid1.getStore().getCount()+1

});

var store2=grid1.getStore();

store2.add(re);

store2.commitChanges();

//------begin add at last

OpMultiFieldArray(arrName,0,0,(grid1.getStore().getCount()+1));

});

}

//------end add1 button click

//----------delete1 button click

if(Ext.getDom('Delete1')!=null)

{

var delbutton=Ext.get('Delete1');

delbutton.on('click',function(){

var _rd = grid1.getSelectionModel().getSelected() ;

var delindex=grid1.getStore().indexOf(_rd);

if(grid1.getSelectionModel().getCount()==1)

{

grid1.getStore().remove(_rd);

grid1.getStore().commitChanges();

}

else

{

alert('每次只能删除一条!');

}

OpMultiFieldArray(arrName,1,delindex);

});

}

//-----------end delete1 buttom click

//-----------begin insert1 buttom click

if(Ext.getDom('Insert1')!=null)

{

var insbutton=Ext.get('Insert1');

insbutton.on('click',function(){

var _rd = grid1.getSelectionModel().getSelected() ;

var insindex=grid1.getStore().indexOf(_rd);

var re=new Ext.data.Record(

{

Seq:insindex+1

});

var store2=grid1.getStore();

if(grid1.getSelectionModel().getSelected()!=null)

{

store2.insert(insindex,re);

store2.commitChanges();

}

else

{

alert('请选择要插入的位置!');

}

//------begin insert at index

OpMultiFieldArray(arrName,2,insindex,insindex);

var arrSeq=CoToArray(arrName[0]);

for(i=0;i<arrSeq.length;i++)

{

arrSeq[i]=i+1;

}

Ext.getDom(arrName[0]).value=arrSeq.join(";");

//------end insert at index

});

}

//-----------end iinsert1 buttom click

});

5.3.子表单中需要加入的html代码部分:

<div id="grid"></div>

<input type="button" id="Add1" value="增加"/>

<input type="button" id="Delete1" value="删除"/>

<input type="button" id="Insert1" value="插入"/>

<div id="grid1"></div>

注意这些都为内嵌html,并且需要设置隐藏条件。

还有建立需要的多值域.

结合Domino打造全功能的Grid的更多相关文章

  1. 第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

    第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...

  2. 四十七 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

    elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/se ...

  3. 释放至强平台 AI 加速潜能 汇医慧影打造全周期 AI 医学影像解决方案

    基于英特尔架构实现软硬协同加速,显著提升新冠肺炎.乳腺癌等疾病的检测和筛查效率,并帮助医疗科研平台预防"维度灾难"问题 <PAGE 1 LEFT COLUMN: CUSTOM ...

  4. Entity Framework7 入门之全功能.NET版本下使用EF7(含源码)另附数据迁移常见错误处理

    Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7 昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Fr ...

  5. OpenResty 是一个全功能的 Web 应用服务器

    OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过众多进行良好设计的 ...

  6. gocode+auto-complete搭建emacs的go语言自动补全功能

    上篇随笔记录了在emacs中使用go-mode和goflymake搭建了go语言的简单编程环境(推送门),今天来记录一下使用gocode+auto-complete配置emacs中go语言的自动补全功 ...

  7. notepad++代码自动补全功能

    可以代码自动补全功能,默认他是没有开启这个功能的,在首选项->备份与自动完成 里面有自动完成这一个设置,可以设置单词补全,也可以设置函数补全,这样写代码就快多了

  8. Eclipse自动补全功能和自动生成作者、日期注释等功能设置

    修改作者.日期注释格式:打开Windows->Preferences->Java->Code Style->Code Templates,点击右边窗口中的Comments,可以 ...

  9. 【原创】Matlab中plot函数全功能解析

    [原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 ...

随机推荐

  1. IOS s数据存储之归档解档

    #import <Foundation/Foundation.h> @interface Student : NSObject <NSCoding>; @property(no ...

  2. UIColor 分类 16进制转 RGB

    .h #import <UIKit/UIKit.h> @interface UIColor (WJ) + (UIColor *)colorWithWJString:(NSString *) ...

  3. php中::的使用方法

    (转载于http://www.nowamagic.net/php/php_UsageOfDoubleColon.php) 双冒号操作符即作用域限定操作符Scope Resolution Operato ...

  4. php错误级别的设置方法

    PHP在运行时, 针对严重程度不同的错误,会给以不同的提示. eg:在$a没声明时,直接相加,值为NULL,相加时当成0来算.但是,却提示NOTICE,即注意. 我们在开发中, 为了程序的规范性,把报 ...

  5. ASP通过代码绑定Gridview控件

    using System.Configuration;using System.Data.OleDb;using System.Data; public partial class datafilm ...

  6. 关于IE8及其以下的IE版本不支持getElementsByClassName

    之前做一下项目的时候知道IE8以及其以下的版本不支持getElementsByClassName,于是乎自己写了一个函数重新定义getElementsByClassName,函数代码如下: funct ...

  7. STL源码--Allocator学习

    内存的分配需要解决的几个问题: 1. 向系统的heap空间请求空间: 2. 考虑多线程的状态问题: 3. 考虑内存空间不足时的应对策略: 4. 考虑过多“小内存块”的碎片问题. SGI的STL底层使用 ...

  8. OpenGL(三)——函数大全

    概述 根据自己写的小程序对各个函数进行解释 OpenGL函数 1. 颜色 1.1  glShadeModel 绘制指定两点间其他点颜色的过渡模式 没试 1.2  glColor 设置当前颜色:可以派生 ...

  9. 腾讯DBA官方博客开通了

    腾讯DBA官方博客开通了,欢迎交流哈..     http://tencentdba.com   腾讯互娱游戏DBA团队一直致力于为游戏提供稳定.高效的DB运营服务,这是我们团队的使命. 过去DBA团 ...

  10. 尝试在Mac上编译DNX

    自从XRE改名为DNX至今,从来没有在Mac OS X上成功编译过DNX.一直很纳闷,难道DNX的开发人员不用Mac?今天突然明白了,DNX的开发人员真的不用Mac.而且DNX用的2个持续集成服务Ap ...