刚写的B/S高级查询界面(基于ExtJs框架)

这几天赶着做一个B/S系统,基于ExtJs框架,从中学了不少东西,今天写的高级查询界面感觉比较有意义,很多人应该也用得着,特拿出来共享一下。当然没正式完工,余下与服务器交互、Lookup列表、取生成查询条件一部分没有完成,做得有点腻了,先放出来,曾经做过的不妨交流一下。

界面:

查询界面

代码:

  1. <DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html><head><title>XXXX系统V1.0</title>
  3. <meta name="Author" contect="彭国辉">
  4. <meta. name="Keywords" content="blog:http://blog.csdn.net/nhconch" />
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf8">
  6. <link rel="stylesheet" type="text/css" href="resources/css/ext-all.css">
  7. <link rel="stylesheet" type="text/css" href="resources/css/hndc.css">
  8. <script type="text/javascript" src="adapter/ext/ext-base.js"></script>
  9. <script type="text/javascript" src="ext-all.js"></script>
  10. <script type="text/javascript" src="source/locale/ext-lang-zh_CN.js"></script>
  11. <script type="text/javascript">
  12. Ext.BLANK_IMAGE_URL = 'resources/images/default/s.gif';
  13. Ext.onReady(function () {
  14. var dsPQ=new Ext.data.JsonStore({
  15.    fields:["idx","relation","leftParenthesis","fieldname","operator","value","rightParenthesis"] 
  16. });
  17. var fieldsDef = new Ext.data.JsonStore({
  18.     fields: ['value','text','type'],
  19.     data:[
  20.         {value:'A.Billno',text:'预约单号',type:'string'},
  21.         {value:'A.Date',text:'时间',type:'date'},
  22.         {value:'A.boolean',text:'布尔',type:'boolean'},
  23.         {value:'A.int',text:'整形',type:'int'},
  24.         {value:'A.float',text:'浮点',type:'float'},
  25.         {value:'A.lookup',text:'Lookup',type:'lookup',data:[[1,'list1'],[2,'list2'],[3,'list3']]}
  26.     ]
  27. });
  28. var numericOp = datetimeOp = new Ext.data.SimpleStore({
  29.     fields: ['value','text'],
  30.     data : [['=','='],['<>','<>'],['<','<'],['<=','<='],['<','>'],['>=','>='],['is null','空白'],['is not null','非空白']]
  31. });
  32. var stringOp = new Ext.data.SimpleStore({
  33.     fields: ['value','text'],
  34.     data : [['=','='],['<>','<>'],['<','<'],['<','>'],
  35.     ['like |%','以...开头'],['like %|','以...结尾'],['like %|%','包含字符'],['not like %|%','不包含字符'],
  36.     ['is null','空白'],['is not null','非空白']]
  37. });
  38. var lookupOp = booleanOp = new Ext.data.SimpleStore({
  39.     fields: ['value','text'],
  40.     data : [['=','='],['<>','<>'],['is null','空白'],['is not null','非空白']]
  41. });
  42. var objGridTextEditor = new Ext.grid.GridEditor(new Ext.form.TextField());
  43. //var objGridMemoEditor = new Ext.grid.GridEditor(new Ext.form.TextArea());
  44. var objGridDateEditor = new Ext.grid.GridEditor(new Ext.form.DateField({format:'Y-m-d'}));
  45. var objGridIntegerEditor = new Ext.grid.GridEditor(new Ext.form.NumberField({allowBlank:false,allowNegative:false,allowDecimals:false}));
  46. var objGridFloatEditor = new Ext.grid.GridEditor(new Ext.form.NumberField({allowBlank:false,allowNegative:false}));
  47. var objGridBooleanEditor = new Ext.grid.GridEditor(new Ext.form.ComboBox({
  48.     store: [[true,'是'],[false,'否']],
  49.     mode: 'local',
  50.     readOnly: true,
  51.     triggerAction: 'all',
  52.     allowBlank: false,
  53.     editable: false,
  54.     forceSelection: true,
  55.     blankText:'请选择...'
  56. }));
  57. var objGridLookupEditor = new Ext.grid.GridEditor(new Ext.form.ComboBox({
  58.     //store: [],
  59.     mode: 'local',
  60.     readOnly: true,
  61.     triggerAction: 'all',
  62.     allowBlank: false,
  63.     editable: false,
  64.     forceSelection: true,
  65.     blankText:'请选择...'
  66. }));
  67. function fileListChange(field,newValue,oldValue){
  68.     //alert(field);
  69. }
  70. function findRecordValue(store,prop, propValue,field){
  71.     var record;
  72.     if(store.getCount() > 0){
  73.         store.each(function(r){
  74.             if(r.data[prop] == propValue){
  75.                 rrecord = r;
  76.                 return false;
  77.             }
  78.         });
  79.     }
  80.     return record ? record.data[field] : '';
  81. }
  82. function displayOperator(v){
  83.     switch(v){
  84.         case 'is null': return '空白';
  85.         case 'is not null': return '非空白';
  86.         case 'like |%': return '以...开头';
  87.         case 'like %|': return '以...结尾';
  88.         case 'like %|%': return '包含字符';
  89.         case 'not like %|%': return '不包含字符';
  90.         default: return v;
  91.     }
  92. }
  93. function displayValue(v, params, record){
  94.     var dataType = findRecordValue(fieldsDef,'value',record.get('fieldname'),'type');
  95.     var operator = record.get('operator');
  96.     if (operator=='is null'||operator=='is not null') return '';
  97.     switch(dataType){
  98.         case 'date': return v ? v.dateFormat('Y-m-d'): '';
  99.         case 'boolean': return (v?'是':'否');
  100.         default: return v;
  101.     }
  102. }
  103. var qRowData = Ext.data.Record.create([
  104.     {name:'idx',type:'int'},
  105.     {name:'relation',type:'string'},
  106.     {name:'leftParenthesis',type:'string'},
  107.     {name:'fieldname',type:'string'},
  108.     {name:'operator',type:'string'},
  109.     {name:'value',type:'string'},
  110.     {name:'rightParenthesis',type:'string'}
  111. ]);
  112. var dsPQ=new Ext.data.JsonStore({
  113.    data:[],
  114.    fields:["idx","relation","leftParenthesis","fieldname","operator","value","rightParenthesis"] 
  115. });
  116. var colM=new Ext.grid.ColumnModel([
  117.     {
  118.         header:"关系",
  119.         dataIndex:"relation",
  120.         50,
  121.         renderer: function(v){return (v=='and'?'并且':'或者')},
  122.         editor:new Ext.form.ComboBox({ 
  123.             store: [['and','并且'],['or','或者']],
  124.             mode: 'local',
  125.             readOnly: true,
  126.             triggerAction: 'all',
  127.             allowBlank: false,
  128.             editable: false,
  129.             forceSelection: true,
  130.             blankText:'请选择'
  131.         })
  132.     },{
  133.         header:"括号",
  134.         dataIndex:"leftParenthesis",
  135.         40,
  136.         editor:new Ext.form.ComboBox({
  137.             store: ['(','((','((','(((','(((('],
  138.             mode: 'local',
  139.             triggerAction: 'all',
  140.             valueField: 'value',
  141.             displayField: 'text',
  142.             editable: false
  143.         })
  144.     },{
  145.         header:"字段名",
  146.         dataIndex:"fieldname",
  147.         130,
  148.         renderer: function(v){return findRecordValue(fieldsDef,'value',v,'text');},
  149.         editor:new Ext.form.ComboBox({
  150.             store: fieldsDef,
  151.             mode: 'local',
  152.             triggerAction: 'all',
  153.             valueField: 'value',
  154.             displayField: 'text',
  155.             editable: false,
  156.             listeners:{change:fileListChange}
  157.         })
  158.     },{
  159.         header:"运算符",
  160.         80,
  161.         dataIndex:"operator",
  162.         renderer: displayOperator
  163.     },{
  164.         header:"内容",
  165.         dataIndex:"value",
  166.         130,
  167.         renderer: displayValue
  168.     },{
  169.         header:"括号",
  170.         40,
  171.         dataIndex:"rightParenthesis",
  172.         editor:new Ext.form.ComboBox({
  173.             store: [')','))',')))','))))'],
  174.             mode: 'local',
  175.             triggerAction: 'all',
  176.             valueField: 'value',
  177.             displayField: 'text',
  178.             editable: false
  179.         })
  180.     }
  181. ]);
  182. var grdDPQuery = new Ext.grid.EditorGridPanel({
  183.     height:500,
  184.     490,
  185.     renderTo:"hello",   
  186.     cm:colM,
  187.     sm:new Ext.grid.RowSelectionModel({singleSelect.:false}),
  188.     store:dsPQ,
  189.     region:'center',
  190.     border: false,
  191.     enableColumnMove: false,
  192.     enableHdMenu: false,
  193.     loadMask: {msg:'加载数据...'},
  194.     clicksToEdit:1,
  195.     tbar:[
  196.         {text:'添加',handler:function(){
  197.                 var count = dsPQ.getCount();
  198.                 var r = new qRowData({idx:dsPQ.getCount(),relation:'and',leftParenthesis:'',fieldname:'',operator:'=',value:'',rightParenthesis:''});
  199.                 dsPQ.commitChanges();
  200.                 dsPQ.insert(count,r);
  201.             }
  202.         },
  203.         {text:'删除',handler:function(){
  204.                 //store = grid.getStore();
  205.                 var selections = grdDPQuery.getSelectionModel().getSelections();
  206.                 for(var i = 0; i < selections.length; i++){ 
  207.                     dsPQ.remove(selections[i]); 
  208.                 }
  209.             }
  210.         },
  211.         {text:'全部清除',handler:function(){dsPQ.removeAll();}}
  212.     ],
  213.     listeners: {
  214.         afteredit: function(e){
  215.             if (e.column==2/*e.field=='fieldname'*/){
  216.                 var oldDataType = findRecordValue(fieldsDef,'value',e.originalValue,'type');
  217.                 var newDataType = findRecordValue(fieldsDef,'value',e.value,'type');
  218.                 if (oldDataType!=newDataType){
  219.                     e.record.set('operator', '=');
  220.                     e.record.set('value', '');
  221.                 }
  222.             }
  223.         },
  224.         cellclick: function(grid, rowIndex, columnIndex, e){
  225.             if (columnIndex!=3&&columnIndex!=4) return;
  226.             var record = grid.getStore().getAt(rowIndex);  // Get the Record
  227.             //var fieldName = grid.getColumnModel().getDataIndex(columnIndex); // Get field name
  228.             //var data = record.get(fieldName);
  229.             var dataType = findRecordValue(fieldsDef,'value',record.get('fieldname'),'type');
  230.             if (dataType=='') return;//未选定字段,退出
  231.             if (columnIndex==3){//绑定运算符
  232.                 var grdEditor = grid.colModel.getCellEditor(columnIndex,rowIndex);
  233.                 if (grdEditor) grdEditor.destroy();
  234.                 var _store;
  235.                 switch(dataType){
  236.                     case 'string': _store = stringOp; break;
  237.                     case 'date': _store = datetimeOp; break;
  238.                     case 'boolean': _store = booleanOp; break;
  239.                     case 'int':
  240.                     case 'float': _store = numericOp; break;
  241.                     case 'lookup': _store = lookupOp; break;
  242.                 }
  243.                 grdEditor = new Ext.form.ComboBox({
  244.                     store: _store,
  245.                     mode: 'local',
  246.                     triggerAction: 'all',
  247.                     valueField: 'value',
  248.                     displayField: 'text',
  249.                     editable: false
  250.                 })
  251.                 grid.colModel.setEditor(columnIndex, new Ext.grid.GridEditor(grdEditor));
  252.             }
  253.             else if (columnIndex==4){//绑定编辑器
  254.                 var operator = record.get('operator');
  255.                 if (operator=='is null'||operator=='is not null'){
  256.                     grid.colModel.setEditor(columnIndex, null);
  257.                     return;
  258.                 }
  259.                 var grdEditor;
  260.                 switch(dataType){
  261.                     case 'string': grdEditor = objGridTextEditor; break;
  262.                     case 'date': grdEditor = objGridDateEditor; break;
  263.                     case 'boolean': grdEditor = objGridBooleanEditor; break;
  264.                     case 'int': grdEditor = objGridIntegerEditor; break;
  265.                     case 'float': grdEditor = objGridFloatEditor; break;
  266.                     case 'lookup': grdEditor = objGridLookupEditor; break;
  267.                 }
  268.                 if (grid.colModel.getCellEditor(columnIndex,rowIndex)!=grdEditor){
  269.                     grid.colModel.setEditor(columnIndex, grdEditor);
  270.                 }
  271.             }
  272.         }
  273.     }
  274. });
  275. });
  276. </script>
  277. </head><div id="hello"></div><body>
  278. </body></html>
原文地址:https://www.cnblogs.com/hannover/p/1846269.html