- 浏览: 342124 次
- 性别:
- 来自: 武汉
最新评论
-
ynymf:
错位问题看这里:http://www.cnblogs.com/ ...
EXTJS制作的嵌套表格实例(点击一行,展开下面的子表) -
xlshlr:
code.php在哪????貌似么有找到这个文件
ExtJS带验证码登录框[新增回车提交] -
langfeng123ac:
二货,这种写法本地又不行,本地有图片,服务器上又没图片。。浪费 ...
JQUERY+ASP.NET的AJAX文件上传(含Demo) -
553718707:
楼主有没有解决方法啊?
EXTJS制作的嵌套表格实例(点击一行,展开下面的子表) -
553718707:
这个代码对于,子表格的列数很多的时候会出现子表格的列与数据行错 ...
EXTJS制作的嵌套表格实例(点击一行,展开下面的子表)
用extjs,一个很重要的原因是因为他的grid真的很好,很强大,要使用它的grid,不可避免会用到PagingToolbar这个widget,不过使用后发现,这个paging的工具栏有几个缺点:
1.通过键盘快捷键翻页,方式与我们习惯不太一样,看看PagingToolbar源代码:
而我希望使用pageup或方向←翻到前一页,使用pagedown或方向→翻到后一页,使用home或方向↑翻到第一页,使用end或↓翻到最后一页
2.页码选择的textfield未进行格式控制,源代码中使用的是一个dom,因此也没有ext中textfield控件的样式去美化,可以使用任何字符去输入。
3.缺少自定义pageSize的输入框
4.和grid配合时,grid第一次load的时候必须要提供start和limit两个参数,比较麻烦,而且传递给后台的参数start和limit不方便后台使用,一般后台翻页的对象经过封装,使用pageNo和pageSize属性的较多,因此要改造pagingtoolbar的传输方式
下面是经过扩展的DynamicPageBar的代码:
此扩展修改了翻页的逻辑,传递给后台的参数,以及新增加了几个事件和方法用来更灵活的控制翻页逻辑,增加了自定义每页显示数量,和Grid配合时无需指定start和limit参数,传递给后台的参数为pageNo与pageSize,排序也没有什么问题,如图:
调用的代码:
1.通过键盘快捷键翻页,方式与我们习惯不太一样,看看PagingToolbar源代码:
- onPagingKeydown : function(e){
- var k = e.getKey(), d = this.getPageData(), pageNum;
- if (k == e.RETURN) {
- e.stopEvent();
- pageNum = this.readPage(d);
- if(pageNum !== false){
- pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1;
- this.doLoad(pageNum * this.pageSize);
- }
- }else if (k == e.HOME || k == e.END){//第一页和最后一页
- e.stopEvent();
- pageNum = k == e.HOME ? 1 : d.pages;
- this.field.dom.value = pageNum;
- }else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){//前一页和后一页
- e.stopEvent();
- if(pageNum = this.readPage(d)){
- var increment = e.shiftKey ? 10 : 1;
- if(k == e.DOWN || k == e.PAGEDOWN){
- increment *= -1;
- }
- pageNum += increment;
- if(pageNum >= 1 & pageNum <= d.pages){
- this.field.dom.value = pageNum;
- }
- }
- }
- }
onPagingKeydown : function(e){ var k = e.getKey(), d = this.getPageData(), pageNum; if (k == e.RETURN) { e.stopEvent(); pageNum = this.readPage(d); if(pageNum !== false){ pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1; this.doLoad(pageNum * this.pageSize); } }else if (k == e.HOME || k == e.END){//第一页和最后一页 e.stopEvent(); pageNum = k == e.HOME ? 1 : d.pages; this.field.dom.value = pageNum; }else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){//前一页和后一页 e.stopEvent(); if(pageNum = this.readPage(d)){ var increment = e.shiftKey ? 10 : 1; if(k == e.DOWN || k == e.PAGEDOWN){ increment *= -1; } pageNum += increment; if(pageNum >= 1 & pageNum <= d.pages){ this.field.dom.value = pageNum; } } } }
而我希望使用pageup或方向←翻到前一页,使用pagedown或方向→翻到后一页,使用home或方向↑翻到第一页,使用end或↓翻到最后一页
2.页码选择的textfield未进行格式控制,源代码中使用的是一个dom,因此也没有ext中textfield控件的样式去美化,可以使用任何字符去输入。
3.缺少自定义pageSize的输入框
4.和grid配合时,grid第一次load的时候必须要提供start和limit两个参数,比较麻烦,而且传递给后台的参数start和limit不方便后台使用,一般后台翻页的对象经过封装,使用pageNo和pageSize属性的较多,因此要改造pagingtoolbar的传输方式
下面是经过扩展的DynamicPageBar的代码:
- Ext.ns("Ext.ux.grid");
- Ext.ux.grid.DynamicPageBar=Ext.extend(Ext.Toolbar,{
- pageSize:20,
- pageNo:1,
- totalCount:0,
- displayMsg:'Displaying {0} - {1} of {2}',
- emptyMsg : 'No data to display',
- beforePageText : "page",
- afterPageText : "of {0}",
- beforeChooseText: "show",
- afterChooseText: "items",
- firstText : "First Page",
- prevText : "Previous Page",
- nextText : "Next Page",
- lastText : "Last Page",
- refreshText : "Refresh",
- initComponent:function(){
- this.addEvents("toFirst","toPre","toNext","toLast","toPage","Refresh","change");
- Ext.ux.grid.DynamicPageBar.superclass.initComponent.call(this);
- this.bind(this.store);
- },
- onRender:function(ct,position){
- Ext.ux.grid.DynamicPageBar.superclass.onRender.call(this, ct, position);
- this.first = this.addButton({
- tooltip: this.firstText,
- iconCls: "x-tbar-page-first",
- disabled: true,
- handler: this.onClick.createDelegate(this, ["first"])
- });
- this.prev = this.addButton({
- tooltip: this.prevText,
- iconCls: "x-tbar-page-prev",
- disabled: true,
- handler: this.onClick.createDelegate(this, ["pre"])
- });
- this.addSeparator();
- this.add(this.beforePageText);
- this.field=this.addField(new Ext.form.NumberField({
- id:"pageNoField",
- value:1,
- allowDecimals:false,
- allowNegative:false,
- minValue:1,
- target:this.onPagingKeydown,
- scopeTarget:this,
- width:30,
- enableKeyEvents:true,
- listeners:{
- "focus":function(obj){
- obj.selectText();
- },
- "keydown":function(obj,e){
- eval(obj.target(obj,e,obj.scopeTarget));
- }
- }
- }));
- this.afterTextEl = this.addText(String.format(this.afterPageText, 1));
- this.addSeparator();
- this.next = this.addButton({
- tooltip: this.nextText,
- iconCls: "x-tbar-page-next",
- disabled: true,
- handler: this.onClick.createDelegate(this, ["next"])
- });
- this.last = this.addButton({
- tooltip: this.lastText,
- iconCls: "x-tbar-page-last",
- disabled: true,
- handler: this.onClick.createDelegate(this, ["last"])
- });
- this.addSeparator();
- this.loading = this.addButton({
- tooltip: this.refreshText,
- iconCls: "x-tbar-loading",
- handler: this.onClick.createDelegate(this, ["refresh"])
- });
- this.addSeparator();
- this.add(this.beforeChooseText);
- this.choose=this.addField(
- new Ext.form.NumberField({
- id:"pageChooseField",
- width:30,
- allowDecimals:false,
- allowNegative:false,
- minValue:1,
- target:this.onChooseKeydown,
- scopeTarget:this,
- enableKeyEvents:true,
- listeners:{
- "focus":function(obj){
- obj.selectText();
- },
- "keydown":function(obj,e){
- eval(obj.target(obj,e,obj.scopeTarget));
- }
- }
- })
- );
- this.add(this.afterChooseText);
- this.addSeparator();
- if(this.displayInfo){
- this.displayEl = Ext.fly(this.el.dom).createChild({cls:'x-paging-info'});
- };
- this.loadParams={pageNo:this.pageNo,pageSize:this.pageSize};
- Ext.getCmp("pageChooseField").setValue(this.loadParams.pageSize);
- this.store.baseParams=this.loadParams;
- },
- onClick : function(which){
- var store = this.store;
- switch(which){
- case "first":
- this.loadParams.pageNo=1;
- this.fireEvent('toFirst', this, this.getPageData());
- break;
- case "pre":
- this.loadParams.pageNo--;
- this.fireEvent('toPre', this, this.getPageData());
- break;
- case "next":
- this.loadParams.pageNo++;
- this.fireEvent('toNext', this, this.getPageData());
- break;
- case "last":
- var total = store.getTotalCount();
- this.loadParams.pageNo=Math.ceil(total/this.loadParams.pageSize);
- this.fireEvent('toLast', this, this.getPageData());
- break;
- case "refresh":
- this.fireEvent('refresh', this, this.getPageData());
- break;
- };
- this.doLoad();
- },
- bind:function(store){
- store = Ext.StoreMgr.lookup(store);
- store.on("beforeload", this.beforeLoad, this);
- store.on("load", this.onLoad, this);
- store.on("loadexception", this.onLoadError, this);
- this.store = store;
- },
- beforeLoad:function(){
- if(this.rendered && this.loading){
- this.store.recordIndex=this.getCursor()+1;
- this.loading.disable();
- }
- },
- onLoad : function(store, r, o){
- if(!this.rendered){
- return;
- }
- var d=this.getPageData();
- this.afterTextEl.el.innerHTML = String.format(this.afterPageText, d.pageNum);
- Ext.getCmp("pageNoField").setValue(d.pageNo);
- this.first.setDisabled(d.pageNo == 1);
- this.prev.setDisabled(d.pageNo == 1);
- this.next.setDisabled(d.pageNo == d.pageNum);
- this.last.setDisabled(d.pageNo == d.pageNum);
- this.loading.enable();
- this.updateInfo();
- this.fireEvent('change', this, this.getPageData());
- this.ownerCt.view.updateHeaderSortState();
- },
- doLoad : function(){
- var params=this.getPageData();
- this.store.baseParams=params;
- this.store.load();
- },
- onLoadError:function(){
- if(!this.rendered){
- return;
- }
- this.loading.enable();
- },
- getPageData:function(){
- var total = this.store.getTotalCount();
- var pageData=this.loadParams;
- pageData.pageNum=Math.ceil(total/pageData.pageSize);
- return pageData;
- },
- updateInfo : function(){
- if(this.displayEl){
- var count = this.store.getCount();
- var d = this.getPageData();
- var preCount = (d.pageNo-1)*d.pageSize;
- var msg = count == 0 ?
- this.emptyMsg :
- String.format(
- this.displayMsg,
- preCount+1, preCount+count, this.store.getTotalCount()
- );
- this.displayEl.update(msg);
- }
- },
- onPagingKeydown : function(obj,e,scope){
- var k=e.getKey();
- var currentNo=obj.getValue();
- var params=scope.loadParams;
- if(k == e.ENTER){
- e.stopEvent();
- if(params.pageNo != currentNo){
- if(currentNo<1||currentNo>params.pageNum){
- obj.setValue(params.pageNo);
- return;
- }else{
- params.pageNo=currentNo;
- }
- }else{
- return;
- }
- }else if (k == e.HOME || k == e.UP){
- e.stopEvent();
- if(currentNo<1||currentNo>params.pageNum){
- obj.setValue(scope.loadParams.pageNo);
- return;
- }
- if(params.pageNo==1)return;
- params.pageNo = 1;
- }else if (k == e.LEFT || k == e.PAGE_UP){
- if(currentNo<1||currentNo>params.pageNum){
- obj.setValue(params.pageNo);
- return;
- }
- e.stopEvent();
- if(params.pageNo==1)return;
- params.pageNo=Math.max(1,params.pageNo-1);
- }else if (k == e.RIGHT || k == e.PAGE_DOWN){
- e.stopEvent();
- if(currentNo<1||currentNo>params.pageNum){
- obj.setValue(params.pageNo);
- return;
- }
- if(params.pageNo==params.pageNum)return;
- params.pageNo=Math.min(params.pageNum,params.pageNo+1);
- }else if (k == e.END || k == e.DOWN){
- e.stopEvent();
- if(currentNo<1||currentNo>params.pageNum){
- obj.setValue(params.pageNo);
- return;
- }
- if(params.pageNo==params.pageNum)return;
- params.pageNo = params.pageNum;
- }else{
- return;
- }
- scope.doLoad();
- },
- onChooseKeydown:function(obj,e,scope){
- var k=e.getKey();
- var currentNo=obj.getValue();
- var params=scope.loadParams;
- if(k==e.ENTER){
- if(currentNo<1||currentNo==params.pageSize){
- obj.setValue(params.pageSize);
- return ;
- }else{
- params.pageSize=currentNo;
- params.pageNo=1;
- scope.doLoad();
- }
- }else{
- return;
- }
- },
- isLastPage:function(){
- var d=this.getPageData();
- return d.pageNo==d.pageNum;
- },
- isFirstPage:function(){
- var d=this.getPageData();
- return d.pageNo==1;
- },
- toFirstPage:function(){
- if(!this.isFirstPage()){
- this.onClick("first");
- }
- },
- toLastPage:function(){
- if(!this.isLastPage()){
- this.onClick("last");
- }
- },
- toPrePage:function(){
- if(!this.isFirstPage()){
- this.onClick("pre");
- }
- },
- toNextPage:function(){
- if(!this.isLastPage()){
- this.onClick("next");
- }
- },
- refresh:function(){
- this.onClick("refresh");
- },
- getCursor:function(){
- var d=this.getPageData();
- return (d.pageNo-1)*d.pageSize;
- }
- });
- Ext.reg("dpagebar",Ext.ux.grid.DynamicPageBar);
Ext.ns("Ext.ux.grid"); Ext.ux.grid.DynamicPageBar=Ext.extend(Ext.Toolbar,{ pageSize:20, pageNo:1, totalCount:0, displayMsg:'Displaying {0} - {1} of {2}', emptyMsg : 'No data to display', beforePageText : "page", afterPageText : "of {0}", beforeChooseText: "show", afterChooseText: "items", firstText : "First Page", prevText : "Previous Page", nextText : "Next Page", lastText : "Last Page", refreshText : "Refresh", initComponent:function(){ this.addEvents("toFirst","toPre","toNext","toLast","toPage","Refresh","change"); Ext.ux.grid.DynamicPageBar.superclass.initComponent.call(this); this.bind(this.store); }, onRender:function(ct,position){ Ext.ux.grid.DynamicPageBar.superclass.onRender.call(this, ct, position); this.first = this.addButton({ tooltip: this.firstText, iconCls: "x-tbar-page-first", disabled: true, handler: this.onClick.createDelegate(this, ["first"]) }); this.prev = this.addButton({ tooltip: this.prevText, iconCls: "x-tbar-page-prev", disabled: true, handler: this.onClick.createDelegate(this, ["pre"]) }); this.addSeparator(); this.add(this.beforePageText); this.field=this.addField(new Ext.form.NumberField({ id:"pageNoField", value:1, allowDecimals:false, allowNegative:false, minValue:1, target:this.onPagingKeydown, scopeTarget:this, width:30, enableKeyEvents:true, listeners:{ "focus":function(obj){ obj.selectText(); }, "keydown":function(obj,e){ eval(obj.target(obj,e,obj.scopeTarget)); } } })); this.afterTextEl = this.addText(String.format(this.afterPageText, 1)); this.addSeparator(); this.next = this.addButton({ tooltip: this.nextText, iconCls: "x-tbar-page-next", disabled: true, handler: this.onClick.createDelegate(this, ["next"]) }); this.last = this.addButton({ tooltip: this.lastText, iconCls: "x-tbar-page-last", disabled: true, handler: this.onClick.createDelegate(this, ["last"]) }); this.addSeparator(); this.loading = this.addButton({ tooltip: this.refreshText, iconCls: "x-tbar-loading", handler: this.onClick.createDelegate(this, ["refresh"]) }); this.addSeparator(); this.add(this.beforeChooseText); this.choose=this.addField( new Ext.form.NumberField({ id:"pageChooseField", width:30, allowDecimals:false, allowNegative:false, minValue:1, target:this.onChooseKeydown, scopeTarget:this, enableKeyEvents:true, listeners:{ "focus":function(obj){ obj.selectText(); }, "keydown":function(obj,e){ eval(obj.target(obj,e,obj.scopeTarget)); } } }) ); this.add(this.afterChooseText); this.addSeparator(); if(this.displayInfo){ this.displayEl = Ext.fly(this.el.dom).createChild({cls:'x-paging-info'}); }; this.loadParams={pageNo:this.pageNo,pageSize:this.pageSize}; Ext.getCmp("pageChooseField").setValue(this.loadParams.pageSize); this.store.baseParams=this.loadParams; }, onClick : function(which){ var store = this.store; switch(which){ case "first": this.loadParams.pageNo=1; this.fireEvent('toFirst', this, this.getPageData()); break; case "pre": this.loadParams.pageNo--; this.fireEvent('toPre', this, this.getPageData()); break; case "next": this.loadParams.pageNo++; this.fireEvent('toNext', this, this.getPageData()); break; case "last": var total = store.getTotalCount(); this.loadParams.pageNo=Math.ceil(total/this.loadParams.pageSize); this.fireEvent('toLast', this, this.getPageData()); break; case "refresh": this.fireEvent('refresh', this, this.getPageData()); break; }; this.doLoad(); }, bind:function(store){ store = Ext.StoreMgr.lookup(store); store.on("beforeload", this.beforeLoad, this); store.on("load", this.onLoad, this); store.on("loadexception", this.onLoadError, this); this.store = store; }, beforeLoad:function(){ if(this.rendered && this.loading){ this.store.recordIndex=this.getCursor()+1; this.loading.disable(); } }, onLoad : function(store, r, o){ if(!this.rendered){ return; } var d=this.getPageData(); this.afterTextEl.el.innerHTML = String.format(this.afterPageText, d.pageNum); Ext.getCmp("pageNoField").setValue(d.pageNo); this.first.setDisabled(d.pageNo == 1); this.prev.setDisabled(d.pageNo == 1); this.next.setDisabled(d.pageNo == d.pageNum); this.last.setDisabled(d.pageNo == d.pageNum); this.loading.enable(); this.updateInfo(); this.fireEvent('change', this, this.getPageData()); this.ownerCt.view.updateHeaderSortState(); }, doLoad : function(){ var params=this.getPageData(); this.store.baseParams=params; this.store.load(); }, onLoadError:function(){ if(!this.rendered){ return; } this.loading.enable(); }, getPageData:function(){ var total = this.store.getTotalCount(); var pageData=this.loadParams; pageData.pageNum=Math.ceil(total/pageData.pageSize); return pageData; }, updateInfo : function(){ if(this.displayEl){ var count = this.store.getCount(); var d = this.getPageData(); var preCount = (d.pageNo-1)*d.pageSize; var msg = count == 0 ? this.emptyMsg : String.format( this.displayMsg, preCount+1, preCount+count, this.store.getTotalCount() ); this.displayEl.update(msg); } }, onPagingKeydown : function(obj,e,scope){ var k=e.getKey(); var currentNo=obj.getValue(); var params=scope.loadParams; if(k == e.ENTER){ e.stopEvent(); if(params.pageNo != currentNo){ if(currentNo<1||currentNo>params.pageNum){ obj.setValue(params.pageNo); return; }else{ params.pageNo=currentNo; } }else{ return; } }else if (k == e.HOME || k == e.UP){ e.stopEvent(); if(currentNo<1||currentNo>params.pageNum){ obj.setValue(scope.loadParams.pageNo); return; } if(params.pageNo==1)return; params.pageNo = 1; }else if (k == e.LEFT || k == e.PAGE_UP){ if(currentNo<1||currentNo>params.pageNum){ obj.setValue(params.pageNo); return; } e.stopEvent(); if(params.pageNo==1)return; params.pageNo=Math.max(1,params.pageNo-1); }else if (k == e.RIGHT || k == e.PAGE_DOWN){ e.stopEvent(); if(currentNo<1||currentNo>params.pageNum){ obj.setValue(params.pageNo); return; } if(params.pageNo==params.pageNum)return; params.pageNo=Math.min(params.pageNum,params.pageNo+1); }else if (k == e.END || k == e.DOWN){ e.stopEvent(); if(currentNo<1||currentNo>params.pageNum){ obj.setValue(params.pageNo); return; } if(params.pageNo==params.pageNum)return; params.pageNo = params.pageNum; }else{ return; } scope.doLoad(); }, onChooseKeydown:function(obj,e,scope){ var k=e.getKey(); var currentNo=obj.getValue(); var params=scope.loadParams; if(k==e.ENTER){ if(currentNo<1||currentNo==params.pageSize){ obj.setValue(params.pageSize); return ; }else{ params.pageSize=currentNo; params.pageNo=1; scope.doLoad(); } }else{ return; } }, isLastPage:function(){ var d=this.getPageData(); return d.pageNo==d.pageNum; }, isFirstPage:function(){ var d=this.getPageData(); return d.pageNo==1; }, toFirstPage:function(){ if(!this.isFirstPage()){ this.onClick("first"); } }, toLastPage:function(){ if(!this.isLastPage()){ this.onClick("last"); } }, toPrePage:function(){ if(!this.isFirstPage()){ this.onClick("pre"); } }, toNextPage:function(){ if(!this.isLastPage()){ this.onClick("next"); } }, refresh:function(){ this.onClick("refresh"); }, getCursor:function(){ var d=this.getPageData(); return (d.pageNo-1)*d.pageSize; } }); Ext.reg("dpagebar",Ext.ux.grid.DynamicPageBar);
此扩展修改了翻页的逻辑,传递给后台的参数,以及新增加了几个事件和方法用来更灵活的控制翻页逻辑,增加了自定义每页显示数量,和Grid配合时无需指定start和limit参数,传递给后台的参数为pageNo与pageSize,排序也没有什么问题,如图:
调用的代码:
- var mainStore=new Ext.data.Store({
- autoLoad:true,
- url:sys.Constants.ROOTPATH+"/sysmgr/SysUser_page.do",
- remoteSort:true,
- sortInfo:{
- field:"createDate",
- direction:"DESC"
- },
- reader:mainReader});
- var mainPageBar=new Ext.ux.grid.DynamicPageBar({
- pageSize:15,
- store:mainStore,
- displayInfo:true,
- emptyMsg:"没有查询到相关的记录"});
- var mainGrid=new Ext.grid.GridPanel({
- renderTo:Ext.getBody(),
- width:1200,
- height:420,
- frame:true,
- stripeRows:true,
- loadMask:true,
- viewConfig:{
- forceFit:true
- },
- selModel:sm,
- colModel:cm,
- store:mainStore,
- bbar:mainPageBar
- });
var mainStore=new Ext.data.Store({ autoLoad:true, url:sys.Constants.ROOTPATH+"/sysmgr/SysUser_page.do", remoteSort:true, sortInfo:{ field:"createDate", direction:"DESC" }, reader:mainReader}); var mainPageBar=new Ext.ux.grid.DynamicPageBar({ pageSize:15, store:mainStore, displayInfo:true, emptyMsg:"没有查询到相关的记录"}); var mainGrid=new Ext.grid.GridPanel({ renderTo:Ext.getBody(), width:1200, height:420, frame:true, stripeRows:true, loadMask:true, viewConfig:{ forceFit:true }, selModel:sm, colModel:cm, store:mainStore, bbar:mainPageBar });
发表评论
-
浅谈Coolite 方法调用
2009-06-13 08:24 2879今天需要做个复选框删除,碰到了一个小难题,然后我一通乱写,居然 ... -
ExtJS Loading 悬浮层
2009-06-08 11:45 4219<!DOCTYPE html PUBLIC &q ... -
Ext中TreePanel控件和TabPanel控件搭配测试
2009-03-23 08:58 2647在实际的项目中,左边树形菜单,提供各种功能点击,右边一个面板, ... -
ExtJs grid使用详细[转]
2009-03-08 21:36 89392008-11-20 09:09 Ext ... -
ExtJS带验证码登录框[新增回车提交]
2009-03-08 21:29 7030/** 用户带验证码登 ... -
ExtJs2.0学习系列(14)--Ext.TreePanel之第三式(可增删改的树)
2009-03-04 19:28 1449继续tree的learn! 今天就来个可增删改的树吧,操作数 ... -
extjs中 combobox级联
2009-03-04 19:13 7336关键字: extjs, combobox, 级 ... -
ext动态新增一行之二
2009-03-03 10:39 1441ext 动态 新增行 新增一行(2)------------- ... -
ext动态新增一行
2009-03-03 10:37 1561ext 动态 新增行 新增一行(1)------------- ... -
ext表单之高级选项
2009-03-03 10:36 1163ext表单之高级选项--------------------- ... -
ext实现标签式浏览内容
2009-03-03 10:31 1507Ext.onReady(function(){ E ... -
ext异步树加入子节点事件
2009-03-03 10:30 2144extext异步树加入子节点 ... -
实现Ext combox 动态数据加载
2009-03-02 20:37 2479核心代码如下:(注意名称的对应!) 服务器生成的json数据形 ... -
解决TreeNode.reload()失效的办法
2009-03-02 20:36 3881Ext Api文档里面 TreeNode.reload()是没 ... -
Ext2.0的通用grid包括(增、删、改、查、导出excel)
2009-03-02 20:32 2862下面为扩张grid的 代码/** * @a ... -
ext构造自己的组件
2009-03-02 20:16 1331/*** @title:新闻中心模块* @au ... -
Ext.Window
2009-02-28 17:19 2117var winUpload = new Ext.Window( ... -
ExtJs中的树分析及实现
2009-02-27 18:12 2296<网上抄录> 首先我们来看日志分类树,这一部分我将 ... -
扩展EXTJS框架的内容检查
2009-02-27 10:36 1058Ext.apply(Ext.form.VTyp ... -
刚写的B/S高级查询界面(基于ExtJs框架)
2009-02-26 10:16 4175这几天赶着做一个B/S系统,基于ExtJs框架,从中学了不少东 ...
相关推荐
office2john的源文件
青海省各市、县区及街镇SVG图
# 基于Java NIO框架的网络IO处理系统 ## 项目简介 本项目是一个基于Java NIO(非阻塞IO)框架的网络IO处理系统。通过使用Java NIO的多路复用技术,系统能够高效地处理多个客户端的连接和IO操作。项目涵盖了从基本的Socket编程到复杂的NIO多路复用实现,适合学习和理解Java网络编程的高级特性。 ## 项目的主要特性和功能 1. 多路复用技术使用Java NIO的Selector机制,实现单线程处理多个客户端的连接和IO操作。 2. 多线程处理通过多线程技术,系统能够并发处理多个客户端的请求,提高服务器的处理能力。 3. 文件IO操作包括基本的文件写入、缓冲文件IO、随机访问文件写入等操作,展示了Java文件IO的多种实现方式。 4. 网络IO操作包括Socket客户端和服务器的实现,展示了如何使用Java进行网络通信。
二叉树先、中、后序遍历及层次遍历代码 C90版
支持向量机
# 基于Arduino和Android的温湿度数据采集系统 ## 项目简介 本项目是一个基于Arduino和Android的温湿度数据采集系统,主要用于远程监控环境中的温湿度数据。系统由Arduino Nano控制DHT22传感器进行数据采集,并通过USRWIFI232A模块将数据传输到Android设备。Android端通过WiFi连接到服务器,实时读取并显示温湿度数据。 ## 项目的主要特性和功能 硬件设计 使用Arduino Nano作为主控芯片。 采用DHT22传感器进行温湿度数据采集。 通过USRWIFI232A模块实现无线数据传输。 软件设计 Arduino端实现DHT传感器的读取功能,包括温度和湿度的数据采集与处理。 Android端开发了一个Android应用,通过WiFi连接到服务器,实时读取并显示温湿度数据。 功能模块
c语言情人节的红玫瑰
c语言UDP传输系统源码
数字标识控件
c语言打字母游戏源码
c语言实现数字雨
android Gallery实现异步加载网络图片 并只加载当前停止页面图
ASP.NET手机端H5会议室预约系统源码 手机版会议室预约源码 一、源码介绍 H5手机版会议室预约系统是一个高效快速便利的内部预约平台,让需要预定会议室的人能通过这个平 台发布预定,没有预定的人也能通过平台查看他人预定。通过后台添加账号即可登录预约平台,发布会 议室预定。 二、主要功能 后台管理包括 会议室信息管理,预约信息管理,用户信息管理。 前台手机版预约系统包括 日历查看预定信息,点击进入所选日期详细预约信息,预定会议室,我的预 约等功能模块。 后台采用模型管理功能可以使用后台对表结构进行维护,方便二次开发。 后台也可以增加部门,实现各部门之间管理员查看各自部门预约信息,用户信息等功能。
修复了实时获取区服 修复多区识别问题 带CDK功能 还有一些 忘记了 1年前修复的 好久没搞了
ASP.NET教育培训管理系统源码 一、源码描述:可以实现学员发卡,学员缴费,学员上课,教师管理,课程管理,图书管理, 水晶报表查询,文字与图形并存,管理员权限设置,学员生日提醒,图书逾期提醒。 二、菜单功能 1、 学员管理 2、 教师管理 3、 课程管理 4、 图书管理 5、 统计报表 6、 辅助功能 7、 系统设置 8、 添加学员 9、 学员上课 10、图书借阅 11、今日提醒 12、短信平台 13、微信平台 14、数据清理 三、注意事项 1、开发环境为Visual Studio 2010,数据库为ACCESS,使用.net 4.0开发, C/S架构。 2、管理员登陆名:admin 密码: admin
考研真题及讲解介绍-数学-2024
c语言做的一个任务管理器
c语言学生信息系统
大致思路以及代码