结合Domino打造全功能的Grid
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的更多相关文章
- 第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能
第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...
- 四十七 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能
elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/se ...
- 释放至强平台 AI 加速潜能 汇医慧影打造全周期 AI 医学影像解决方案
基于英特尔架构实现软硬协同加速,显著提升新冠肺炎.乳腺癌等疾病的检测和筛查效率,并帮助医疗科研平台预防"维度灾难"问题 <PAGE 1 LEFT COLUMN: CUSTOM ...
- Entity Framework7 入门之全功能.NET版本下使用EF7(含源码)另附数据迁移常见错误处理
Entity Framework7 入门之全功能.NET(Console, WinForms, WPF等)使用EF7 昨天,我们介绍了EF的新特性和开发计划,如果你还不了解,请移步 Entity Fr ...
- OpenResty 是一个全功能的 Web 应用服务器
OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过众多进行良好设计的 ...
- gocode+auto-complete搭建emacs的go语言自动补全功能
上篇随笔记录了在emacs中使用go-mode和goflymake搭建了go语言的简单编程环境(推送门),今天来记录一下使用gocode+auto-complete配置emacs中go语言的自动补全功 ...
- notepad++代码自动补全功能
可以代码自动补全功能,默认他是没有开启这个功能的,在首选项->备份与自动完成 里面有自动完成这一个设置,可以设置单词补全,也可以设置函数补全,这样写代码就快多了
- Eclipse自动补全功能和自动生成作者、日期注释等功能设置
修改作者.日期注释格式:打开Windows->Preferences->Java->Code Style->Code Templates,点击右边窗口中的Comments,可以 ...
- 【原创】Matlab中plot函数全功能解析
[原创]Matlab中plot函数全功能解析 该帖由Matlab技术论(http://www.matlabsky.com)坛原创,更多精彩内容参见http://www.matlabsky.com 功能 ...
随机推荐
- 修改ubuntu DNS的步骤(图文)
有时候连接上VPN服务器后,还是打不开某些网站,这时候,需要对DNS进行更改,一般是修改成为谷歌提供的免费DNS:8.8.8.8 8.8.4.4,在windows下更改比较简单(点击查看“连接上VP ...
- hdoj 2544最短路
Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要 ...
- noip2010-t2
题目大意:小明过生日的时候,爸爸送给他一副乌龟棋当作礼物.乌龟棋的棋盘是一行 N个格子,每个格子上一个分数(非负整数).棋盘第 1 格是唯一 的起点,第 N格是终点,游戏要求玩家控制一个乌龟棋子从起点 ...
- JSHint 使用说明
SHint介绍 翻译自www.jshint.comJSHint(注意不是jslint:))是一个由javascript社区驱动开发的用于检查javascript代码错误和问题的工具,有了他,可以使你保 ...
- Windows 8.1 应用再出发 (WinJS) - 几种新增控件(1)
Windows 8.1 和 WinJS 引入了以下新控件和功能,分别是:AppBarCommand.BackButton.Hub.ItemContainer.NavBar.Repeater.WebVi ...
- C# async await 学习笔记2
C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...
- Makefile技术和应用总结
如何学习和运用Makefile 怎么写Makefile?不想讲太多如何如何做.Makefile这东西,公司让一两个人来负责就好了,否则一定是一锅粥.每次看到招聘广告里说,要求懂Makefile,懂Li ...
- Titanium系列--利用Titanium开发android App实战总结
1. Titanium中,通过ImageView Controller 显示图片,图片地址要放在app/assets下,然后自己建一个文件夹,把图片放在这里.如下图,然后alloy代码:<Ima ...
- SQLServer 2012之AlwaysOn —— 指定数据同步链路,消除网络抖动导致的提交延迟问题
事件起因:近期有研发反应,某数据库从08切换到12环境后,不定期出现写操作提交延迟的问题: 事件分析:在排除了系统资源争用等问题后,初步分析可能由于网络抖动导致同步模式alwayson节点经常出现会话 ...
- Android 5.x特性概览四
上节,我们说了palatte及其特性,这里我们介绍Android 5.x的另一个特性视图与阴影. 在第一节,我们就提到了Material Design 一大特性就是就是扁平化,倘若说 iOS 的扁平化 ...