(实战)使用ExtJs+WCF打造分行信息管理功能的一些心得

转载请注明出处:博客园 老蒋

之前在网上看了不少的ExtJs文章,对这个JavaScript类库也有少少的了解(初级入门级 J ),最近开始慢慢尝试在公司项目里进行实际的应用,现在有个项目里要加个功能,正好就来实战一下了,本篇文章我们主要介绍一些开发中需要注意的地方,基础教程请查看本论坛的其它帖子。

另外考虑到高版本Ext要收费或需要您的项目也进行开源,所以我们就用ext-2.0.2了,能实现我们要的功能就OK了。

新加的这个功能要实现对分行信息的增、删、改、查,如果这个用常规的asp.net方式来开发,我想对大家来说,这个是家常便饭,现在我们用ExtJs+WCF来实现。

(此示例参考了博客园 Robin http://www.cnblogs.com/jillzhang和小庄:http://www.cnblogs.com/xiaozhuang 的相关文章)

先来一张最终的效果图:

现在,我们一步步来实现上面的效果

一、将数据库的分行信息展现在界面里

1程序中的数据操作使用LINQ to SQL来实现(如何建立 LINQ to SQL请参考这个帖子:http://bbs.extjs.org.cn/viewthread.php?tid=19&extra=page%3D1)

2如何添加一个WCF服务也可以参考http://bbs.extjs.org.cn/viewthread.php?tid=19&extra=page%3D1,在本示例中,我们建立的WCF服务为BmsBranchInfoFilters.svc,此服务用过展现分行数据及实现extjs grid列过滤(相当于是查询了J

3建立一个extjs grid ,此部分见JSBmsDataGrid.js文件,需要注意的地方是

aWCF返回的时间格式是"open_date":"\/Date(976723200000+0800)\/",如果不在客户端进行处理的话,会原样输出,没办法看了,本示例添加时间转换的地方


转换函数如下:


function convertDate(value) {


        return value ? DateToStr(eval("new " + value.substr(1, value.length - 2))) : undefined;


}


b我们需要实现当鼠标移动到数据行时,会显示双击行进行编辑
字样,要实现这个功能,我们需要进行这样的处理:


grid.on("mouseover", function(e, t) {


        var row;


        if ((row = this.getView().findRowIndex(t)) !== false) {



Ext.QuickTips.register({



target: e.target,



text:
'
双击行进行编辑',




autoHide:
true,



hideDelay: 0,



showDelay: 0



})



}



}, grid);


c我们需要在双击某个数据行时,弹出编辑窗口,这个功能实现的代码如下:


//双击记录进行查看或编辑



grid.on(
'rowdblclick', function(grid, rowIndex, e) {


        var selectedKeys = grid.selModel.selections.keys;



EditRecord(selectedKeys);



});



dext-2.0.2版本grid在Firefox里显示过长的内容时,不会像IE一样过长的内容会自动加上;同时还有一个日历控件的在Firefox显示过长的问题。要显示过长的问题,我要需要加上以下这段代码。(日历的解决方法见:http://www.extjs.org.cn/node/219 ,另外的过长问题也是从http://www.extjs.org.cn 找到的解决方法,具体链接不太清楚了。):


//firefox下文本过长自动换行


    if (!Ext.isIE) {



grid.store.on(
'load', function() {



grid.el.select(
"table[class=x-grid3-row-table]").each(function(x) {



x.addClass(
'x-grid3-cell-text-visible');



});



});



}



在页面上的CSS定义如下:


.x-grid3-cell-text-visible .x-grid3-cell-inner



{



overflow:visible;padding:3px 3px 3px 5px;white-space:normal;




}



二、添加功能(编辑窗口与此类似)



添加窗口的效果如下:


在网上看到的FormPanel的示例,都是一列的,现在我们要两列的效果,而且有些行是要跨两列的,还有的我们的例子里,地址类型的有两个字段,在表单里,我们只需要其中一行有字段提示就行了,第二个字段只要有输入框就可以了。


a、
两行的实现


在FormPanel的items里添加一个item,layout方式为column,即两列;然后我们在这个item里添加两个子item,layout方式为form。


b、
跨两列的实现


在FormPanel的items里添加一个item, layout方式为form,然后在添加一个子item,layout方式为form。



c、
在输入框前面不需要显示fieldLabel和那个:号


在这里,我们不能使用hideLabel等于true来实现,如果这样,文本输入框就直接在最左边显示了,跟其它的不对齐,这里我们使用一个变通的方法,就是不设置fieldLabel,但是还有一个问题,有个:号在输入框前面呢,还是没有实现我们的效果,那再加个labelSeparator: ''就可以实现我们的效果了。



d、
其他一些小细节allowBlank: false不能为空, maxLength: 40 可以输入的最大长度 , maxLengthText内容过长时的提示。



三、过滤功能的实现



Ext 2.0.2没有实现列的过滤功能,我们从网上找到了牛人们写的扩展,代码见示例JS目录下的GridFilter文件夹,我们只需要把相关的JS代码在使用的页面引用,并在grid中以插件的方式加到grid里,代码如下:


var filters = new Ext.grid.GridFilters({



filters: [




{ type:
'numeric', dataIndex: 'branch_id' },




{ type:
'string', dataIndex: 'chi_name' },




{ type:
'string', dataIndex: 'eng_name' },




{ type:
'string', dataIndex: 'status' },




{ type:
'numeric', dataIndex: 'area' },




{ type:
'date', dataIndex: 'open_date' },




{ type:
'date', dataIndex: 'close_date' },




{ type:
'string', dataIndex: 'chi_addr_1' },




{ type:
'string', dataIndex: 'phone_no' },




{ type:
'string', dataIndex: 'fax_no' }



]


});


Grid里的代码见下图





四、删除功能



删除功能我们主要是要获取到选中项的id,可以通过grid.selModel.selections.keys来获取



本示例下载:ExtJsSample

posted @ 2009-03-29 23:38  老蒋  阅读(1361)  评论(1编辑  收藏  举报