Ext2.0的form不单增加了时间输入控件、隐藏输入控件,还修改了创建方法,通过formpanel代替了原来form,column也根据新的布局定义更新了定义方式。总体来说,定义一个form更简单便捷了。本文将通过一个实例介绍一下2.0的form的创建以及其大部分控件的使用方法,因水平有限,错漏难免,忘大家多多谅解!

我们先来看看我们将要设计的form的情况:

呵呵,form有点杂乱,不过在这个fomr里包含了绝大部分Ext2.0的控件,我将会和大家一起探讨一下这些控件的使用。
在创建一个form之前,我们先增加以下语句:
  1. Ext.QuickTips.init();
  2. Ext.form.Field.prototype.msgTarget = 'side';

第一句的目的是为需要的元件提供提示信息功能,form的主要提示信息就是客户端验证的错误信息了。

第二句的目的就是设置控件的错误信息显示位置,主要可选的位置有:

这个大家可以根据各人喜好设置,我习惯使用“side”,这里有一点要注意的,就是注意控制控件的宽度,以防不够宽度显示错误图标,这个下面会说到。
好了,现在创建我们的form,2.0的方法就是直接创建一个formpanel:
  1. var simpleForm = new Ext.FormPanel({
  2. labelAlign: 'left',
  3. title: '表单例子',
  4. buttonAlign:'right',
  5. bodyStyle:'padding:5px',
  6. width: 600,
  7. frame:true,
  8. labelWidth:80,
  9. items: [],
  10. buttons: []
  11. });
  12. simpleForm.render(document.body);
在formpanle里,我们定义了form控件的标题是在左边的(labelAlign: 'left');form的标题栏显示标题“表单的例子”;它的按钮位置是在右对齐的(buttonAlign:'right');边的类型设置了内补丁5px(bodyStyle:'padding:5px');总宽度是600px;设置了面板的边角是圆弧过度的(frame:true),我设置这个属性主要目的不是因为边角,而是因为背景,如果不设置这个,背景颜色将为白色,设置了这个将会加入海蓝色的背景图,好看点;还设置了form控件的标题宽度是80px(labelWidth:80)。还有一些其它的设置选项,我这里就不多说,大家可以参看2.0的API。
items数组的设置是我们的重点了,form上的所有控件都是在这里设置的。
从form的结构图中看到,form整体上是分了两列的(实际上不是的,呵呵)。因为要分列,所以要使用columnLayout类。在使用columnLayout类之前,我们需要了解一下CSS中float属性的作用,改属性主要作用是设置对象是否及如何浮动,属性值为none、left和right三个。column设置是left,意思就是对象浮在左边的。那这个有什么作用呢?其实这个和我们在word中输入文字,默认文字是左对齐的,当一行文字的宽度超过页面的宽度时将自动换行是一样的。 我们通过一个例子来说明一下。
首先我们定义一个div,背景色是黑色,宽度和高度都是200:
  1. <div style='background:black;width:200px;height:200px;'>
  2. </div>

然后在里面加入2个div,每个宽度和高度都是200,背景色一个是红色,一个是绿色:

  1. <div style='background:black;width:200px;height:200px;'>
  2. <div style='background:red;width:50px;height:50px;'></div>
  3. <div style='background:green;width:50px;height:50px;'></div>
  4. </div>

我们来看看效果:

在没有使用float之前,两个子div是分别各占一行的。好,现在我们在两个子div中加入“float:left”在看看效果:

  1. <div style='background:black;width:200px;height:200px;'>
  2. <div style='background:red;width:50px;height:50px;float:left;'></div>
  3. <div style='background:green;width:50px;height:50px;float:left;'></div>
  4. </div>

两个子div出现在同一行了。我们复制一下两个子div,粘贴两次,然后看看效果:

  1. <div style='background:black;width:200px;height:200px;'>
  2. <div style='background:red;width:50px;height:50px;float:left;'></div>
  3. <div style='background:green;width:50px;height:50px;float:left;'></div>
  4. <div style='background:red;width:50px;height:50px;float:left;'></div>
  5. <div style='background:green;width:50px;height:50px;float:left;'></div>
  6. <div style='background:red;width:50px;height:50px;float:left;'></div>
  7. <div style='background:green;width:50px;height:50px;float:left;'></div>
  8. </div>

6个子div有序的按左对齐方式排列在一起了,当一行的子div的宽度超过了父div的宽度时,子div自动换行到了第二行。
不知道大家是否看得明白?看不明白自己再动手改变一下子div的宽度和高度,看看效果。column的工作方式就是这样的。明白这个很重要,因为在定义checkbox和radio的时候,如果想它们的选项在同一行,就要注意column的宽度,不然就无法让他们在同一行。不过现在column是通过百分比来定义宽度的,我们只要控制好百分比就行了。
好了,我们继续写form,因为要用到column,所以我们先在formpanel的itmes加入一个column的定义:
  1. {
  2. layout:'column',
  3. border:false,
  4. labelSeparator:':',
  5. items:[]
  6. }
代码里定义了在这里使用的是columnlayout(layout:'column');没有边(border:false);标题的分隔符号我们用中文冒号代替英文的冒号(labelSeparator:':')。coulmnLayout里的控件将定义在items里。
我们首先在items里加入一个常用输入控件,是用来输入姓名的:
  1. {
  2. columnWidth:.5,
  3. layout: 'form',
  4. border:false,
  5. items: [{
  6. xtype:'textfield',
  7. fieldLabel: '姓名',
  8. name: 'name',
  9. anchor:'90%'
  10. }]
  11. }
我们设置了该列的宽度占总宽度的50%(columnWidth:.5);在布局里放了一个formlayout用来放置控件(layout: 'form');formlayout也是没有边的(border:false)。在formlayout里有一个类型为textfield'(xtype:'textfield')的输入控件。控件标题为姓名(fieldLabel: '姓名'),输入框(input)的name属性设置“name”(name: 'name'),输入框的长度为列宽减去标题的宽度后的90%(anchor:'90%'),余下的10%的是给显示错误信息图标用的。
在加入性别的radio控件时就要注意了,这里需要加入两个radio,第一radio是有标题的,第二是没有的,而且两个radio加起来的宽度应该正好是余下的列宽(50%):
  1. {
  2. columnWidth:.25,
  3. layout: 'form',
  4. border:false,
  5. items: [{
  6. style:'margin-top:5px',
  7. xtype:'radio',
  8. fieldLabel: '性别',
  9. boxLabel:'男',
  10. name: 'sex',
  11. checked:true,
  12. inputValue:'男',
  13. anchor:'95%'
  14. }]
  15. },{
  16. columnWidth:.25,
  17. layout: 'form',
  18. labelWidth:0,
  19. labelSeparator:'',
  20. hideLabels:true,
  21. border:false,
  22. items: [{
  23. style:'margin-top:5px',
  24. xtype:'radio',
  25. fieldLabel: '',
  26. boxLabel:'女',
  27. name: 'sex',
  28. inputValue:'女',
  29. anchor:'95%'
  30. }]
  31. }
从代码中可以看到,除了列宽设置为25%外,其它的列设置和第一控件是一样。Formlayout里加入了一个类型为radio的控件。控件的标题是性别,控件的选择显示文本是男(boxLabel:'男),input的name属性值是sex(name: 'sex'),该控件默认是已选的(checked:true),控件的值(value)是男(inputValue:'男'),input的宽度是95%。在这里我还设置一个css属性,顶部的外补丁为5px(style:'margin-top:5px'),原因是为了选择按钮和标题对齐,大家可以将该属性去掉然后看看效果。
第二个raido控件的列设置就有所不同,因为它不需要标题,所以要设置隐藏标题(hideLabels:true),标题的宽度设置为0(labelWidth:0),还要设置其标题分隔符号为空(labelSeparator:'')。其余的设置和第一个radio的设置没有不同,只是input的值不同了。
我们已经设置了3列,3列的列宽分别为50%、25%、25%,根据float的原则,下一列将从第二行开始。
在第二行第一列我们要增加的是一个日期选择控件:
  1. {
  2. columnWidth:.5,
  3. layout: 'form',
  4. border:false,
  5. items: [{
  6. xtype:'datefield',
  7. fieldLabel: '出生日期',
  8. name: 'birthday',
  9. anchor:'90%'
  10. }]
  11. }

日期控件的列宽也是50%,列的其它设置没有变化。控件的类型为datefield,标题是出生日期,input的name属性是birthday,intput宽度也是设置了90%,出来留出空位给错误信息外,还可以让控件与上一行的姓名的宽度相同,整列看起来比较整齐。

日期控件的设置和普通文本输入的设置一样简单,这里就不多说了。不过要说到的是汉化的问题。在2.0版自带的本地化文件ext-lang-zh.js中存在一些小bug,我们需要自己修改一下。
首先要修改的是周的显示,原来的定义是:
  1. Date.dayNames = [
  2. "周日",
  3. "周一",
  4. "周二",
  5. "周三",
  6. "周四",
  7. "周五",
  8. "周六"
  9. ];

因为在日期选择中显示的区域不够宽,只能显示一个汉字,所以需要将上面定义的把“周”去掉,修改为:

  1. Date.dayNames = [
  2. "日",
  3. "一",
  4. "二",
  5. "三",
  6. "四",
  7. "五",
  8. "六"
  9. ];

在年份和月份选择中的按钮文字还是英文“ok”和“cancel”的,这里我们也需要修改一下:

  1. if(Ext.DatePicker){
  2. Ext.apply(Ext.DatePicker.prototype, {
  3. todayText         : "今天",
  4. minText           : "日期在最小日期之前",
  5. maxText           : "日期在最大日期之后",
  6. disabledDaysText  : "",
  7. disabledDatesText : "",
  8. monthNames      : Date.monthNames,
  9. dayNames          : Date.dayNames,
  10. nextText          : '下月 (Control+Right)',
  11. prevText          : '上月 (Control+Left)',
  12. monthYearText     : '选择一个月 (Control+Up/Down 来改变年)',
  13. todayTip          : "{0} (Spacebar)",
  14. okText            : "确定",
  15. cancelText        : "取消",
  16. format            : "y年m月d日"
  17. });
  18. }

上面定义中黑色字体部分就是要加入的代码。如果不喜欢默认格式是“y年m月d日”,需要修改:

  1. if(Ext.form.DateField){
  2. Ext.apply(Ext.form.DateField.prototype, {
  3. disabledDaysText  : "禁用",
  4. disabledDatesText : "禁用",
  5. minText           : "该输入项的日期必须在 {0} 之后",
  6. maxText           : "该输入项的日期必须在 {0} 之前",
  7. invalidText       : "{0} 是无效的日期 - 必须符合格式: {1}",
  8. format            : "Y-m-d"
  9. });
  10. }

修改DatePicker不会改变DateField的格式的,这个自己根据情况决定,呵呵。

我们继续,现在需要加入一个学历的下拉选择控件。下来选择控件最重要的一个定义就是数据的定义的,数据定义错误,可能得不到我们需要的效果,也是很多朋友感觉最麻烦的地方。
  1. {
  2. columnWidth:.5,
  3. layout: 'form',
  4. border:false,
  5. items: [{
  6. xtype:'combo',
  7. store: new Ext.data.SimpleStore(
  8. {
  9. fields: ["retrunValue", "displayText"],
  10. data: [[1,'小学'],[2,'初中'],[3,'高中'],[4,'中专'],[5,'大专'],[6,'大学']]
  11. }),
  12. valueField :"retrunValue",
  13. displayField: "displayText",
  14. mode: 'local',
  15. forceSelection: true,
  16. blankText:'请选择学历',
  17. emptyText:'选择学历',
  18. hiddenName:'education',
  19. editable: false,
  20. triggerAction: 'all',
  21. allowBlank:false,
  22. fieldLabel: '学历',
  23. name: 'education',
  24. anchor:'90%'
  25. }]
  26. }

列的定义就不说了,没变化。在items里,类型设置成combo了,在这里定义了一个sotre属性,就是选择值存储的地方,因为是在客户端的数据,所以使用了一个简单存储(SimpleStore)。在存储里,我们通过一个数组定义了retrunValue和displayText两个字段。retrunValue字段指定是提交给后台的值,displayText字段指定是在下拉中显示的选择值。然后我们在data里定义了几组数据(data: [[1,'小学'],[2,'初中'],[3,'高中'],[4,'中专'],[5,'大专'],[3,'大学']]),我们可以看到,每组数据都是根据fiedls的定义来组成的,数组里第一个值就是retrunValue的值,第二个值就是displayText的值,例如[1,'小学'],就表示retrunValue是1,displayText是小学。

下面就是很重要的一步了,设置下拉选择框的值和显示文本。本例中设置了下拉选择框的提交值对象的是存储中的retrunValue字段(valueField :"retrunValue"),显示文本是存储中的displayText字段(displayField: "displayText"),通过这两个设置就可将存储中的数据和下拉框对应起来。
因为数据是在本地,所以设置了模式为local(mode: 'local')。该下拉列表只允许选择,不允许输入(editable: false),而且是必须选择一个选项(forceSelection: true)。在没有选择值时显示为选择学历(emptyText:'选择学历')。提交form时,该项如果没有选择,则提示错误信息“请选择学历”(blankText:'请选择学历')。该选项值不允许为空(allowBlank:false)。大家要注意的是hiddenName和name属性,name只是改下拉的名称,作用是可通过,而hiddenName才是提交到后台的input的name。如果没有设置hiddenName,在后台是接收不到结构的,这个大家一定要注意。
因为这个下拉是只能选择的,所以一定要设置属性triggerAction为all,不然当你选择了某个选项后,你的下拉将只会出现匹配选项值文本的选择项,其它选择项是不会再显示了,这样你就不能更改其它选项了。
如果要为控件设置默认值,就设置属性value,value的值要设置为提交给后台的值,不要设置为显示文本。例如本例要设置大学为默认值得,则设置value的值为6。
现在到第三行了,我们要创建一个checkbox选项输入:
  1. {
  2. columnWidth:.35,
  3. layout: 'form',
  4. border:false,
  5. items: [{
  6. xtype:'checkbox',
  7. fieldLabel: '权限组',
  8. boxLabel:'系统管理员',
  9. name: 'popedom',
  10. inputValue:'1',
  11. anchor:'95%'
  12. }]
  13. },{
  14. columnWidth:.2,
  15. layout: 'form',
  16. labelWidth:0,
  17. labelSeparator:'',
  18. hideLabels:true,
  19. border:false,
  20. items: [{
  21. xtype:'checkbox',
  22. fieldLabel: '',
  23. boxLabel:'管理员',
  24. name: 'pepedom',
  25. inputValue:'2',
  26. anchor:'95%'
  27. }]
  28. },{
  29. columnWidth:.2,
  30. layout: 'form',
  31. labelWidth:0,
  32. labelSeparator:'',
  33. hideLabels:true,
  34. border:false,
  35. items: [{
  36. xtype:'checkbox',
  37. fieldLabel: '',
  38. boxLabel:'普通用户',
  39. name: 'pepedom',
  40. inputValue:'3',
  41. anchor:'95%'
  42. }]
  43. },{
  44. columnWidth:.25,
  45. layout: 'form',
  46. labelWidth:0,
  47. labelSeparator:'',
  48. hideLabels:true,
  49. border:false,
  50. items: [{
  51. xtype:'checkbox',
  52. fieldLabel: '',
  53. boxLabel:'访客',
  54. name: 'pepedom',
  55. inputValue:'4',
  56. anchor:'95%'
  57. }]
  58. }

checkbox的设置和radio的设置大同小异,大家注意列宽的定义就行。

第四行的两个输入框主要是测试通过vtypes属性来验证输入框的输入的:
  1. {
  2. columnWidth:.5,
  3. layout: 'form',
  4. border:false,
  5. items: [{
  6. xtype:'textfield',
  7. fieldLabel: '电子邮件',
  8. name: 'email',
  9. vtype:'email',
  10. allowBlank:false,
  11. anchor:'90%'
  12. }]
  13. },{
  14. columnWidth:.5,
  15. layout: 'form',
  16. border:false,
  17. items: [{
  18. xtype:'textfield',
  19. fieldLabel: '个人主页',
  20. name: 'url',
  21. vtype:'url',
  22. anchor:'90%'
  23. }]
  24. }]
  25. }

这里的定义和普通的文本输入框没什么区别,只是多了一个vtypes的属性定义。Vtypes里总共定义了email、url、alpha和alphanum四种类型数据格式,email和url这个不用介绍了,呵呵。alpha是字母和下划线的组合,alphanum是字母、下划线和数字的组合。

下面要加入一个tabpanel,加入3个tab页。
  1. {
  2. xtype:'tabpanel',
  3. plain:true,
  4. activeTab: 0,
  5. height:235,
  6. defaults:{bodyStyle:'padding:10px'},
  7. items:[]
  8. }

要注意的是,这个tabpanel不是在上面coulmn的items里加的,因为不在column里。我们加在formpanel里。把item类型设置为'tabpanel'就行了,然后将标签页头的背景设置为透明的(plain:true),当前活动的标签页是第一页(activeTab: 0),高度设置为235px(height:235),tab页的面板使用内补丁10px(defaults:{bodyStyle:'padding:10px'})。

好了,现在在tabpanel的items加入标签页。第一页主要有两个输入控件,一个是vtypes类型alphanum的登录输入框和一个密码输入框。
  1. {
  2. title:'登录信息',
  3. layout:'form',
  4. defaults: {width: 230},
  5. defaultType: 'textfield',
  6. items: [{
  7. fieldLabel: '登录名',
  8. name: 'loginID',
  9. allowBlank:false,
  10. vtype:'alphanum',
  11. allowBlank:false
  12. },{
  13. inputType:'password',
  14. fieldLabel: '密码',
  15. name: 'password',
  16. allowBlank:false
  17. }]
  18. }

在标签定义了,设置了标签标题是登录信息(title:'登录信息'),控件容器是formlayout(layout:'form'),控件的默认宽度是230px(defaults: {width: 230}),默认控件类型是textfield(defaultType: 'textfield')。

两个控件的定义与前面的textfield定义没什么区别,只是密码输入框需要定义input控件的类型为password(inputType:'password')。两个控件都不允许为空(allowBlank:false)。
第二个标签页里有numberfield、timefield和textfield三个控件:
  1. {
  2. title:'数字时间字母',
  3. layout:'form',
  4. defaults: {width: 230},
  5. defaultType: 'textfield',
  6. items: [{
  7. xtype:'numberfield',
  8. fieldLabel: '数字',
  9. name: 'number'
  10. },{
  11. xtype:'timefield',
  12. fieldLabel: '时间',
  13. name: 'time'
  14. },{
  15. fieldLabel: '纯字母',
  16. name: 'char',
  17. vtype:'alpha'
  18. }]
  19. }

Numberfield顾名思义就是只能输入数字的输入控件。在该例子,没做最大值、最小值任何限制,如果要设置最大值和最小值,分别设置maxValue和minValue两个属性就行了。如果要设置数字输入长度,例如身份证号码,可以设置maxLength和minLength两个属性。可以通过设置maxText、minText、maxLengthText和minLengthText设置各自的验证出错信息。可通过allowDecimals属性设置是否只允许输入整型值,默认值是true,允许输入浮点数。设置allowNegative设置是否只允许输入正数,默认值是true,允许输入正负数。通过decimalPrecision属性可设置小数点后的位数,默认值是2位。

timefield是新增加的时间输入控件,起弥补日期输入控件不能输入时间的作用。它的定义也很简单,设置类型为timefield就行了。timefield默认时间格式是12小时制的,我们可通过修改format属性来修改其数据格式。通过设置increment属性可设置下拉选择值得时间区间,默认值是15分钟的。还可以和数字输入控件一样设置最大值和最小值。下拉的设置和combobox是一样的。
在目前的版本中,timefield类还没有汉化,所以我们要在本地文件中加入timefield的汉化定义:
  1. if(Ext.form.TimeField){
  2. Ext.apply(Ext.form.TimeField.prototype, {
  3. format:'G:i:s',
  4. minText : "该输入项的时间必须大于或等于: {0}",
  5. maxText : "该输入项的时间必须小于或等于: {0}",
  6. invalidText : "{0}不是有效的时间",
  7. });
  8. }

在这里,我默认定义了时间格式是24小时制的,小时为个位数是不加前缀0。

最后一个加入的是测试纯字母输入的,和email等是一样的,我就不介绍了。
在最后一个tab页中加入了一个textarea输入:
  1. {
  2. title:'文本区域',
  3. layout:'fit',
  4. items: {
  5. xtype:'textarea',
  6. id:'area',
  7. fieldLabel:''
  8. }
  9. }

和textfield一样,只要设置类型为textarea就可以了,唯一的区别是为了让textarea和面板自适应面板,使用了fitlayout作为它的容器,所以在这里我们不用设置textarea的宽度和高度。

最后一步就是为form添加按钮了,在formpanel的buttons属性中我们加入了一个保存按钮和取消按钮:
  1. buttons: [{
  2. text: '保存',
  3. handler:function(){
  4. if(simpleForm.form.isValid()){
  5. this.disabled=true;
  6. simpleForm.form.doAction('submit',{
  7. url:'test.asp',
  8. method:'post',
  9. params:'',
  10. success:function(form,action){
  11. Ext.Msg.alert('操作',action.result.data);                                                        this.disabled=false;
  12. },
  13. failure:function(){
  14. Ext.Msg.alert('操作','保存失败!');
  15. this.disabled=false;
  16. }
  17. });
  18. }
  19. }
  20. },{
  21. text: '取消',
  22. handler:function(){simpleForm.form.reset();}
  23. }]

在formpanel类中,form属性指向的是formpanle里的basicform对象,我们可通过formpanle.form来使用该basicform对象。在被例子,我们已经将formpanel对象赋值给了simpleForm这个变量,所以我们可以通过simpleForm.form访问面板里的basicform对象。

在buttons里定义的按钮默认是Ext.Button,所以按钮的属性定义可以查看Ext.Button的API。在这里两个按钮都没用到其它属性,只是设置了显示文本(text)和单击事件。
保存按钮要做的就是先做basicform的客户端验证(simpleForm.form.isValid()),验证通过了则设置该按钮状态为disable,防止2次提交。然后调用simpleForm.form.doAction方法提交数据。doAction方法的第一个参数“submit”的意思是表示执行的是提交操作,提交的后台页面是test.asp(url:'test.asp'),提交方式是post(method:'post'),没有其它提交参数(params:''),提交成功后执行success定义的函数,本例只是显示一个保存成功信息。后台返回的数据格式是需要我们注意的,一定要json格式,而且必须包含“success:true”,不然不会执行success定义的函数。success定义的函数返回两个参数,第一是form本身,第二个是ajax返回的响应结果,在action.result这个json数组了保存了后台返回的数据。例如本例后台返回的json结构是“{success:true,data:~~~}”,其中data部分我将提交的数据将字段名和数据组合成一个字符串。在success函数中,我通过“Ext.Msg.alert('操作',action.result.data);”将data数据显示出来。我们还定义failure函数,就是网络通讯存在问题的时候将显示错误信息。
取消按钮就是简单的reset一下form的控件。
如果想form按以前的老办法提交,可以在formpanel的定义中加入一下设置:
  1. onSubmit: Ext.emptyFn,        submit: function() {            this.getEl().dom.submit();
  2. }

第一个设置的目的是取消formpanel的默认提交函数。第二就是设置新的提交方式为旧方式提交。

至此,我们已经简单的学习一次2.0版中的form控件,希望大家能从中获得收益。如果有什么疑问和建议,请联系我。多谢!
本例子的代码请单击这里下载,例子在form目录下。
本例子的完整代码:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <title>简单的表单例子</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  6. <link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css">
  7. </head>
  8. <body>
  9. <script type="text/javascript" src="../../adapter/ext/ext-base.js"></script>
  10. <script type="text/javascript" src="../../ext-all.js"></script>
  11. <script type="text/javascript" src="../../ext-lang-zh_CN.js"></script>
  12. <script>
  13. Ext.QuickTips.init();
  14. Ext.form.Field.prototype.msgTarget = 'side';
  15. var simpleForm = new Ext.FormPanel({
  16. labelAlign: 'left',
  17. title: '表单例子',
  18. buttonAlign:'right',
  19. bodyStyle:'padding:5px',
  20. width: 600,
  21. frame:true,
  22. labelWidth:80,
  23. items: [{
  24. layout:'column',
  25. border:false,
  26. labelSeparator:':',
  27. items:[{
  28. columnWidth:.5,
  29. layout: 'form',
  30. border:false,
  31. items: [{
  32. xtype:'textfield',
  33. fieldLabel: '姓名',
  34. name: 'name',
  35. anchor:'90%'
  36. }]
  37. },{
  38. columnWidth:.25,
  39. layout: 'form',
  40. border:false,
  41. items: [{
  42. style:'margin-top:5px',
  43. xtype:'radio',
  44. fieldLabel: '性别',
  45. boxLabel:'男',
  46. name: 'sex',
  47. checked:true,
  48. inputValue:'男',
  49. anchor:'95%'
  50. }]
  51. },{
  52. columnWidth:.25,
  53. layout: 'form',
  54. labelWidth:0,
  55. labelSeparator:'',
  56. hideLabels:true,
  57. border:false,
  58. items: [{
  59. style:'margin-top:5px',
  60. xtype:'radio',
  61. fieldLabel: '',
  62. boxLabel:'女',
  63. name: 'sex',
  64. inputValue:'女',
  65. anchor:'95%'
  66. }]
  67. },{
  68. columnWidth:.5,
  69. layout: 'form',
  70. border:false,
  71. items: [{
  72. xtype:'datefield',
  73. fieldLabel: '出生日期',
  74. name: 'birthday',
  75. anchor:'90%'
  76. }]
  77. },{
  78. columnWidth:.5,
  79. layout: 'form',
  80. border:false,
  81. items: [{
  82. xtype:'combo',
  83. store: new Ext.data.SimpleStore(
  84. {
  85. fields: ["retrunValue", "displayText"],
  86. data: [[1,'小学'],[2,'初中'],[3,'高中'],[4,'中专'],[5,'大专'],[6,'大学']]
  87. }),
  88. valueField :"retrunValue",
  89. displayField: "displayText",
  90. mode: 'local',
  91. forceSelection: true,
  92. blankText:'请选择学历',
  93. emptyText:'选择学历',
  94. hiddenName:'education',
  95. editable: false,
  96. triggerAction: 'all',
  97. allowBlank:false,
  98. fieldLabel: '学历',
  99. name: 'education',
  100. anchor:'90%'
  101. }]
  102. },{
  103. columnWidth:.35,
  104. layout: 'form',
  105. border:false,
  106. items: [{
  107. xtype:'checkbox',
  108. fieldLabel: '权限组',
  109. boxLabel:'系统管理员',
  110. name: 'popedom',
  111. inputValue:'1',
  112. anchor:'95%'
  113. }]
  114. },{
  115. columnWidth:.2,
  116. layout: 'form',
  117. labelWidth:0,
  118. labelSeparator:'',
  119. hideLabels:true,
  120. border:false,
  121. items: [{
  122. xtype:'checkbox',
  123. fieldLabel: '',
  124. boxLabel:'管理员',
  125. name: 'pepedom',
  126. inputValue:'2',
  127. anchor:'95%'
  128. }]
  129. },{
  130. columnWidth:.2,
  131. layout: 'form',
  132. labelWidth:0,
  133. labelSeparator:'',
  134. hideLabels:true,
  135. border:false,
  136. items: [{
  137. xtype:'checkbox',
  138. fieldLabel: '',
  139. boxLabel:'普通用户',
  140. name: 'pepedom',
  141. inputValue:'3',
  142. anchor:'95%'
  143. }]
  144. },{
  145. columnWidth:.25,
  146. layout: 'form',
  147. labelWidth:0,
  148. labelSeparator:'',
  149. hideLabels:true,
  150. border:false,
  151. items: [{
  152. xtype:'checkbox',
  153. fieldLabel: '',
  154. boxLabel:'访客',
  155. name: 'pepedom',
  156. inputValue:'4',
  157. anchor:'95%'
  158. }]
  159. },{
  160. columnWidth:.5,
  161. layout: 'form',
  162. border:false,
  163. items: [{
  164. xtype:'textfield',
  165. fieldLabel: '电子邮件',
  166. name: 'email',
  167. vtype:'email',
  168. allowBlank:false,
  169. anchor:'90%'
  170. }]
  171. },{
  172. columnWidth:.5,
  173. layout: 'form',
  174. border:false,
  175. items: [{
  176. xtype:'textfield',
  177. fieldLabel: '个人主页',
  178. name: 'url',
  179. vtype:'url',
  180. anchor:'90%'
  181. }]
  182. }]
  183. },{
  184. xtype:'tabpanel',
  185. plain:true,
  186. activeTab: 0,
  187. height:235,
  188. defaults:{bodyStyle:'padding:10px'},
  189. items:[{
  190. title:'登录信息',
  191. layout:'form',
  192. defaults: {width: 230},
  193. defaultType: 'textfield',
  194. items: [{
  195. fieldLabel: '登录名',
  196. name: 'loginID',
  197. allowBlank:false,
  198. vtype:'alphanum',
  199. allowBlank:false
  200. },{
  201. inputType:'password',
  202. fieldLabel: '密码',
  203. name: 'password',
  204. allowBlank:false
  205. }]
  206. },{
  207. title:'数字时间字母',
  208. layout:'form',
  209. defaults: {width: 230},
  210. defaultType: 'textfield',
  211. items: [{
  212. xtype:'numberfield',
  213. fieldLabel: '数字',
  214. name: 'number'
  215. },{
  216. xtype:'timefield',
  217. fieldLabel: '时间',
  218. name: 'time'
  219. },{
  220. fieldLabel: '纯字母',
  221. name: 'char',
  222. vtype:'alpha'
  223. }]
  224. },{
  225. title:'文本区域',
  226. layout:'fit',
  227. items: {
  228. xtype:'textarea',
  229. id:'area',
  230. fieldLabel:''
  231. }
  232. }]
  233. }],
  234. buttons: [{
  235. text: '保存',
  236. handler:function(){
  237. if(simpleForm.form.isValid()){
  238. this.disabled=true;
  239. simpleForm.form.doAction('submit',{
  240. url:'test.asp',
  241. method:'post',
  242. params:'',
  243. success:function(form,action){
  244. Ext.Msg.alert('操作',action.result.data);
  245. this.disabled=false;
  246. },
  247. failure:function(){
  248. Ext.Msg.alert('操作','保存失败!');
  249. this.disabled=false;
  250. }
  251. });
  252. }
  253. }
  254. },{
  255. text: '取消',
  256. handler:function(){simpleForm.form.reset();}
  257. }]
  258. });
  259. simpleForm.render(document.body);
  260. </script>
  261. </body>
  262. </html>

后台文件的代码(ASP):

  1. <%@Language=VBScript  CodePage=65001%>
  2. <%
  3. dim temp
  4. For Each x In Request.Form
  5. temp=temp& x & ":" & Request.Form(x) & ","
  6. next
  7. Response.Charset="utf-8"
  8. Session.CodePage=65001
  9. response.write "{success:true,data:'"&temp&"'}"
  10. %>

CSS属性float的测试文件代码:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <title>float测试例子</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  6. </head>
  7. <body>
  8. <div style='background:black;width:200px;height:200px;'>
  9. <div style='background:red;width:50px;height:50px;float:left;'></div>
  10. <div style='background:green;width:50px;height:50px;float:left;'></div>
  11. <div style='background:red;width:50px;height:50px;float:left;'></div>
  12. <div style='background:green;width:50px;height:50px;float:left;'></div>
  13. <div style='background:red;width:50px;height:50px;float:left;'></div>
  14. <div style='background:green;width:50px;height:50px;float:left;'></div>
  15. </div>
  16. </body>
  17. </html>

Ext2.0 form使用实例相关推荐

  1. Ext2.0布局类初探

    Ext2.0正式版虽然还没出来,但是官网上的例程还是令人兴奋不已.内存泄漏的问题应该是解决了,布局类更新了,增加了新的东西,grid的功能更加强大,tabs也增加了循环按钮,还增加了类似delphi ...

  2. Ext2.0教程一:Ext介绍以及 ext页面布局

    学习ext有一段时间了,也开发了几个项目,抽点时间做个总结,刚好公司让我做个Ext培训,于是随便写个Ext教程. Ext介绍 Ext是一个很不错的Ajax框架,可以用来开发带有华丽外观的胖客户端应用, ...

  3. Ext2.0框架的Grid使用介绍(转)

     Ext2.0框架的Grid使用介绍 最近空闲时间在学习Ext2.0框架,只有一个字的感叹"强",我从未想到JS代码能够写出这么绚丽的Web页面出来,以前看到YUI,惊若天人,如今 ...

  4. ProE5.0塑胶产品结构设计实例知识视频教程

    ProE5.0塑胶产品结构设计实例知识视频教程 链接:https://pan.baidu.com/s/1_Xc99LsZQ_r3TMWnyFluyw 提取码:hwwl

  5. 关于ext2.0基本引入说明引入过多开发环境效验太多老火

    1.1 Ext版本变迁 * Ext1.0发布于2007年2月,Ext正式从YUI社区中独立出来,不再仅仅支持YUI,而是提供了ext-base.prototype.jquery和YUI4种底层实现.这 ...

  6. ANSYS workbench 19.0基础到实例仿真分析视频教程

    ANSYS workbench 19.0基础到实例仿真分析视频教程 链接:https://pan.baidu.com/s/1Fi7rdlmQ0oE5i_qx1NXEbA 提取码:gezg

  7. 【干货】S7-PLCSIM Advanced V3.0 无法启动实例( Error Code:-30,LicenseNotFound)问题解决方法

    问题:S7-PLCSIM Adavanced V3.0 无法启动实例( Error Code:-30,LicenseNotFound) 综合网上所有答案,现将该问题的解决方法总结如下: 1.首先需要确 ...

  8. python创建一个列表_Python创建一个元素都为0的列表实例

    Python创建一个元素都为0的列表实例 实现创建一个元素都为0的列表: l=10 lis=[0]*l lis 输出结果: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 以上这篇Pyt ...

  9. Django2.0——Form组件简单总结

    官方文档参考 表单初见 Django提供了一个Form组件来配和前端的表单进行使用,Form有两个强大的功能,分别是生成HTML代码和验证数据的合法性.通常我们不会用其第一个功能,因为前端的设计可以做 ...

最新文章

  1. 完整显示动态时间的功能HTML,JS实现HTML页面中动态显示当前时间完整示例_气质_前端开发者...
  2. tp3.2 连接两个数据库
  3. linux mint 13 input method of chinese
  4. Graph Attention Networks
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的图书馆预约占座管理系统
  6. mysql 减函数_mysql时间加减函数
  7. 反编译OD工具OllyDBG 2.0.1下载
  8. teamtalk实现即时通讯
  9. 几款常用UML建模工具介绍
  10. 知识蒸馏 | 知识蒸馏的算法原理与其他拓展介绍
  11. android adb 模拟长按,adb 模拟长按电源键
  12. Docker神器之百度云下载(群辉 LEDE)
  13. python爬虫初试-下载LOL全英雄皮肤
  14. 最安全的飞行器——飞行汽车
  15. 二篇、使用excel做数据驱动把数据管理起来
  16. 学渣的刷题之旅 leetcode刷题 66. 加一
  17. 独轮平衡车c语言源码,两轮平衡车STM32源代码
  18. 高数考研归纳 - 微分学 - 一元微分学
  19. AMCL代码详解(五)根据激光观测更新粒子权重
  20. 为什么会有许多人认为C盘太满会影响电脑运行速度?

热门文章

  1. mysql - AB复制
  2. 关于微软Silverlight,你应该知道的10件事
  3. web架构设计经验分享 (转)
  4. Redis发布带有“流式”数据类型的5.0版本
  5. 数字化正在使CIO职责发生变化
  6. 《你不知道的JavaScript》整理(六)——强制类型转换
  7. [20150608]dbms_random.value.txt
  8. java对于文件传输时---编码格式的一些设置方法
  9. ecshop商城首页怎样设置广告ALT标签
  10. linux无人值守安装