Ext学习

ExtJs2.0学习系列(1)--Ext.MessageBox

大家都知道,刚开始搞extjs的时候,很是有点困难,所以本人在新手刚入门后准备了这个系列的文章.

个人认为用extjs做后台很不错,布局比较完美!

1.  Ext.MessageBox.alert()

有四个参数,为简单起见,主要介绍前面三个参数:

alert(title , msg , function(){} );

其中title,msg为必选参数,function为可选参数,在关闭弹出窗口后触发.

 
 

Ext.MessageBox.alert("title","msg",function(){alert("关闭对话框后弹出!")});

 

【注意】Ext.MessageBox.alert("title","msg",function(e){alert("按钮的值:"+e);});

参数e: 两种值 (ok,cancel).

2.  Ext.MessageBox.confirm()

   基本上同 alert() 方法一模一样.

   【注意】Ext.MessageBox.confirm("title","msg",function(e){alert("按钮的值:"+e);});

参数e:三种值(yes,no,cancel).

3.  Ext.MessageBox.prompt()

有六个参数,比前面alert方法多一个返回值和是否多行.

Ext.MessageBox.prompt("title","msg");

 
 

Ext.MessageBox.prompt("title","msg",

 

    function(e,text){ alert(e+","+text);},this,true);

 

【注意】e是按钮返回值,text是文本框中的输入内容,true为多行,this表示作用域

4.  Ext.MessageBox.show()

功能很强大,采用config配置形式,比前面的方法使用更方便.参数很多,在此列举最常用的配置参数:

a)   animEl:对话框弹出和关闭时的动画效果,比如设置为”id1”,则从id1处弹出并产生动画,收缩则相反;

b)   buttons:弹出框按钮的设置,

【Ext.Msg.OK】【Ext.Msg.OKCANCEL】【Ext.Msg.CAMCEL】【Ext.Msg.YESNO】【Ext.Msg.YESNOCANCEL】

可以自定义按钮上面的字:{"ok","我本来是ok的"},若设为false,则不显示任何按钮,默认为false.

c)   closable:如果为false,则不显示右上角的小叉叉,默认为true;

d)   msg:消息的内容;

e)   title:标题;

f)  fn:关闭弹出框后执行的函数;

g)  icon:弹出框内容前面的图标,

【Ext.MessageBox.INFO】【Ext.MessageBox.ERROR】【Ext.MessageBox.WARNING】【Ext.MessageBox.QUESTION】

h)  width:弹出框的宽度,不带单位;

i)  prompt:设为true,则弹出框带有输入框,默认为false;

j)  multiline:设为true,则弹出框带有多行输入框

k)  progress:设为true,显示进度条,(但是是死的)

l)  progressText:显示在进度条上的字

m)   wait:设为true,动态显示progress

n)  waitConfig:配置参数,以控制显示progress

 
 

Ext.MessageBox.show({

 

    title:"标题",

 

    msg:"内容的消息",

 

    buttons:{"ok":"我不再显示OK了"},

 

    fn:function(e){alert(e);},

 

    animEl:"test1",

 

    width:500,

 

    icon:Ext.MessageBox.INFO,

 

    closable:false,

 

    progress:true,

 

    wait:true,

 

    progressText:"进度条"

 

    //prompt:true

 

    //multiline:true

 

});

 

5.  Ext.MessageBox.show()中的进度条的使用

首先必须知道另外两个方法 Ext.MessageBox.hide()和Ext.MessageBox.updateProgress(value,"ProgressText","msg")(三个参数,看名字就知道意思),

【注意】value为0-1之间的数,表示进度条的进度.

第一种:(通过进度的大小控制进度,满进度为1)

 
 

Ext.get("btn1").on("click",

 

function(){

 

    Ext.MessageBox.show({

 

       title:"df",

 

        msg:"dfd",

 

       progress:true,

 

       width:300,

 

       closable:true

 

    });

 

    var f=function(v){

 

       return  function(){

 

           if(v==12) {

 

              Ext.MessageBox.hide();

 

           }Else{

 

              var  i=v/11;

 

              Ext.MessageBox.updateProgress(i,Math.round(100*i)+"% completed",i);

 

           }

 

       }

 

    }

 

    for(var i=1;i<13;i++){

 

       setTimeout(f(i),i*500);

 

       //从点击时就开始计时,所以500*i表示每500ms就执行一次

 

    }

 

});

 

第二种:(通过固定时间控制进度加载)

 
 

Ext.get("btn1").on("click",

 

function(){

 

    Ext.MessageBox.show({

 

       title:"时间进度条",

 

       msg:"5s后关闭进度框",

 

       progress:true,

 

       width:300,

 

       wait:true,

 

       waitConfig:{interval:600},//0.6s进度条自动加载一定长度

 

       closable:true

 

    });

 

    setTimeout(function(){Ext.MessageBox.hide()},5000);

 

    //5后执行关闭窗口函数

 

}

 

最后关于那个waitConfig的参数,在此说明下:

a)   interval:进度的频率

b)   duration:执行进度的持续时间,超过这个时间后,interval失效,不再产生进度效果,但进度狂也不会消失.

c)   fn:duration的时间到后执行的函数

所以,上面的通过时间控制进度另外一种写法为:

 
 

Ext.get("btn1").on("click",

 

function(){

 

    Ext.MessageBox.show({

 

       title:"时间进度条",

 

       msg:"5s后关闭进度框",

 

       progress:true,

 

       width:300,

 

       wait:true,

 

       waitConfig:{

 

           interval:600,

 

           duration:5000,

 

           fn:function(){

 

              Ext.MessageBox.hide();//让进度条消失

 

       }},

 

       closable:true

 

    });

 

    //setTimeout(function(){Ext.MessageBox.hide()},5000);

 

});

 

 

 

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(2)--Ext.Panel

今天 介绍 extjs 中的 Panel 组件.

 
 

<!-- html代码 -->

 

<div id="container"></div>

 

<!-- js代码 -->

 

var p  = new Ext.Panel({

 

    title: 'My Panel',       //标题

 

    collapsible:true,    //右上角上的那个收缩按钮,设为false则不显示

 

    renderTo: 'container',   //这个panel显示在html中id为container的层中

 

    width:400,

 

    height:200,

 

    html:  "<p>我是内容,我包含的html可以被执行!</p>"//panel主体中的内容,可以执行html代码

 

});

 

因为panel组件的子类组件包括TabPanel,GridPanel,FormPanel,TreePanel 组件,所以非常有必要介绍Panel组件的配置参数和相关的属性、方法.

//配置参数(只列举部分常用参数)

a)  autoLoad:有效的url字符串,把那个url中的body中的数据加载显示,但是可能没有样式和js控制,只是html数据

b)  autoScroll:设为true 则 内容溢出的时候产生滚动条,默认为false

c)  autoShow:设为true显示设为"x-hidden"的元素,很有必要,默认为false

d)  bbar:底部条,显示在主体内,  //代码:bbar:[{text:'底部工具栏bottomToolbar'}]

e)  tbar:顶部条,显示在主体内,  //代码:tbar:[{text:'顶部工具栏topToolbar'}]

f)  buttons:按钮集合,自动添加到footer中(footer参数,显示在主体外)

// 代码 :buttons:[{text:"按钮位于footer"}]

g)  buttonAlign:footer中按钮的位置,枚举值为:"left","right","center",默认为right

h)  collapsible:设为true,显示右上角的收缩按钮,默认为false

i)  draggable:true则可拖动,但需要你提供操作过程,默认为false

j)  html:主体的内容

k)  id:id值,通过id可以找到这个组件,建议一般加上这个id值

l)  width:宽度

m)  height:高度

n)  title:标题

o)  titleCollapse:设为true,则点击标题栏的任何地方都能收缩,默认为false.

p)  applyTo:(id)呈现在哪个html元素里面

q)  contentEl:(id)呈现哪个html元素里面,把el内的内容呈现

r)  renderTo:(id)呈现在哪个html元素里面

// 关于这三个参数的区别(个人认为:applyTo和RenderTo强调to到html元素中,contentEl则是html元素到ext组件中去);

关于contentEl有资料如下:

ContentEl - This config option is used to take existing content and place it in the body of a new panel. It is not going to be the actual panel itself. (It will actually copy the innerHTML of the el and use it for the body). You should add either the x-hidden or the x-hide-display CSS class to prevent a brief flicker of the content before it is rendered to the panel. 

ApplyTo - This config option allows you to use pre-defined markup to create an entire Panel. By entire, I mean you can include the header, tbar, body, footer, etc. These elements must be in the correct order/hierarchy. Any components which are not found and need to be created will be autogenerated.

RenderTo - This config option allows you to render a Panel as its created. This would be the same as saying myPanel.render(ELEMENT_TO_RENDER_TO); 

考虑到入门,方法事件会在以后的文章中以实例穿插.

1.  可拖动的panel实例

下面我们做个可拖动panel例子来熟悉下panel这个最基本的组件.

 
 

//下面创建一个允许拖动的panel,但是拖动的结果不能保存

 

var p=new Ext.Panel({

 

    title: 'Drag me',

 

    x:  100,

 

    y:  100,

 

    renderTo:  Ext.getBody(),//x,y,renderTo:Ext.getBody()初始化panel的位置

 

    floating: true,          //true

 

    frame: true,         //圆角边框

 

    width: 400,

 

    height:  200,

 

    draggable:true

 

}).show();               //在这里也可以不show()

 

但是还不能拖到其他的地方,我们需要改写draggable:

 
 

draggable:{

 

    insertProxy: false,//拖动时不虚线显示原始位置

 

    onDrag : function(e){

 

       var  pel = this.proxy.getEl();

 

       this.x  = pel.getLeft(true);

 

       this.y  = pel.getTop(true);//获取拖动时panel的坐标

 

    },

 

    endDrag  : function(e){

 

       this.panel.setPosition(this.x, this.y);//移动到最终位置

 

    }

 

}

 

实现了可保存的拖动,如图:

拖动的时候阴影还在原位置,我们再在draggable中的onDrag事件中添加代码:

 
 

//shadow的realign方法的四个参数,改变shadow的位置大小属性

 

var s  = this.panel.getEl().shadow;

 

if (s)  {

 

    s.realign(this.x, this.y,  pel.getWidth(), pel.getHeight());

 

}

 

最后这个可拖动的panel的代码为:

 
 

var p=new Ext.Panel({

 

    title: 'Drag me',

 

    x:  100,

 

    y:  100,

 

    renderTo:  Ext.getBody(),

 

    floating:  true,

 

    frame:  true,

 

    width:  400,

 

    height:  200,

 

    draggable:  {

 

       insertProxy: false,

 

       onDrag  : function(e){

 

           var pel = this.proxy.getEl();

 

           this.x  = pel.getLeft(true);

 

           this.y  = pel.getTop(true);

 

           var s  = this.panel.getEl().shadow;

 

           if (s)  {

 

              s.realign(this.x, this.y,  pel.getWidth(), pel.getHeight());

 

           }

 

       },

 

       endDrag  : function(e){

 

           this.panel.setPosition(this.x, this.y);

 

       }

 

    }

 

})

 

2. 带顶部,底部,脚部工具栏的panel

 
 

var p=new Ext.Panel({

 

    id:"panel1",

 

    title:"标题",

 

    collapsible:true,

 

    renderTo:"container",

 

    closable:true,

 

    width:400,

 

    height:300,

 

    tbar:[{text:"按钮1"},{text:"按钮2"}],  //顶部工具栏

 

    bbar:[{text:"按钮1"},{text:"按钮2"}],  //底部工具栏

 

    html:"内容",

 

    buttons:[{text:"按钮1"},{text:"按钮2"}]  //footer部工具栏

 

});

 

我们已经在各种工具栏上添加了按钮,但是却没有激发事件,下面我们来添加按钮事件代码:

 
 

tbar:[{text:"按钮1",handler:function(){

 

    Ext.MessageBox.alert("我是按钮1","我是通过按钮1激发出来的弹出框!")}},

 

    {text:"按钮2"}],

 

改写tbar,添加handler句柄,点击顶部工具栏上按钮1,弹出提示框,效果图大家想象下,就不贴出来了

当然,一般情况下,我们只要一个工具栏,这里只是为了演示!

3.panel工具栏

添加下面的代码到panel配置参数中:

 
 

tools:[{id:"save"},{id:"help"},{id:"up"},

 

    {id:"close",

 

    handler:function(){

 

       Ext.MessageBox.alert("工具栏按钮","工具栏上的关闭按钮时间被激发了")}

 

    }],

 

//id控制按钮,handler控制相应的事件

 

id的枚举值为:

toggle (collapsable为true时的默认值)

close      minimize      maximize      restore       gear           pin

unpin      right          left          up            down          refresh

minus      plus          help           search        save          print

 

 

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(3)--Ext.Window

介绍window组件,它继承自panel.

先介绍个最简单例子

 
 

<!-- html代码 -->

 

<div id="win" class="x-hidden"></div>

 

//js代码

 

var w=new Ext.Window({

 

    contentEl:"win",//主体显示的html元素,也可以写为el:"win"

 

    width:300,

 

    height:200,

 

    title:"标题"

 

});

 

w.show();

 

参数介绍:

因为前面已经介绍了panel组件,下面只介绍window组件的几个其他特别的配置参数

//几个前面没有介绍的window自己的配置参数

a)  closeAction:枚举值为:close(默认值),当点击关闭后,关闭window窗口,关闭后,只是hidden窗口

b)  closable:true在右上角显示小叉叉的关闭按钮,默认为true

c)  constrain:true则强制此window控制在viewport,默认为false

d)  modal:true为模式窗口,后面的内容都不能操作,默认为false

e)  plain://true则主体背景透明,false则主体有小差别的背景色,默认为false

w.show()//需要显示下show()方法,默认的窗口是可拖动的,可关闭的,可拖动大小的

实例介绍:

1. 嵌套了tabpanel的window

 
 

var w=new Ext.Window({

 

    contentEl:"win",

 

    width:300,

 

    height:200,

 

    items:new Ext.TabPanel({

 

       activeTab:0,//当前标签为第1个tab(从0开始索引)

 

       border:false,

 

       items:[{title:"tab1",html:"tab1在windows窗口中"},

 

           {title:"tab2",html:"tab2在windows窗口中"}]}),

 

    plain:true,//true则主体背景透明,false则主体有小差别的背景色,默认为false

 

    title:"标题"

 

});

 

w.show();

 

我们通过items把TabPanel组件嵌套在window的主体中去了.

我们再添加工具栏看看

 
 

bbar:[{text:"确定"},{text:"取消",handler:function(){w.close();}}],//bottom部

 

buttons:[{text:"确定"},{text:"取消",handler:function(){w.close();}}],//footer部

 

buttonAlign:"center",//footer部按钮排列位置,这里是中间

 

其他工具栏方法一样.关于window中嵌套复杂的布局,等我们谈完了extjs布局再举例说明.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(4)--Ext.FormPanel之第一式

上篇中我们讨论了Ext.window的简单使用,今天我们要看看强大的FormPanel,也是继承panel组件的使用.

首先弄清楚这个问题,创建的时候: 

Ext.form.FormPanel = Ext.FormPanel; //查看源代码便知,两种方法是一样的

我们还是从最简单的代码实例开始吧:

 
 

<!--html代码-->

 

<div id="form1"></div>

 

//js代码

 

var form1  = new Ext.form.FormPanel({

 

    width:350,

 

    frame:true,//圆角和浅蓝色背景

 

    renderTo:"form1",//呈现在哪个控件里

 

    title:"FormPanel",

 

    bodyStyle:"padding:5px 5px 0",

 

    items:[{

 

       fieldLabel:"UserName",//文本框标题

 

       xtype:"textfield",    //表单文本框

 

       name:"user",

 

       id:"user",

 

       width:200

 

    },{

 

       fieldLabel:"PassWord",

 

       xtype:"textfield",

 

       name:"pass",

 

       id:"pass",

 

       width:200

 

    }],

 

    buttons:[{text:"确定"},{text:"取消",handler:function(){alert("事件!");}}]

 

});

 

都是通过items属性参数把表单元素添加到这个表单中.

我们发现两个文本框的类型和宽度是一样的,我们还可以把items里面的相同项提取出来,以简化代码:

 
 

//简化代码,和上面的代码效果一样

 

var form1  = new Ext.form.FormPanel({

 

    width:350,

 

    frame:true,

 

    renderTo:"form1",

 

    title:"FormPanel",

 

    bodyStyle:"padding:5px 5px 0",

 

    defaults:{width:200,xtype:"textfield"},//*****简化****//

 

    items:[{

 

       fieldLabel:"UserName",

 

       //xtype:"textfield",

 

       name:"user",

 

       id:"user",

 

       //width:200

 

    },{

 

       fieldLabel:"PassWord",

 

       //xtype:"textfield",

 

       name:"pass",

 

       id:"pass",

 

       inputType:"password",

 

       //width:200

 

    }],

 

    buttons:[{text:"确定"},{text:"取消",handler:function(){alert();}}]

 

});

 

关于inputType参数(同input类型相同,只列举几个典型的)如下:

radio     check      text(默认)     file       password等等

关于FormPanel的配置参数,请主要参考panel的参数,这里列举另外两个:

a)   labelAlign:fieldlabel的排列位置,默认为"left",其他两个枚举值是"center","right"

b)   labelWidth:fieldlabel的占位宽

c)   method:"get"或"post"

d)   url:"提交的地址"

e)   submit:提交函数 

因为内容太多,我们先看一个例子.

1. FormPanel的fieldset应用

 
 

//把前面代码重写items属性

 

items:[{

 

    xtype:'fieldset',

 

    title:  '个人信息',

 

    collapsible:  true,

 

    autoHeight:true,

 

    width:330,

 

    defaults:  {width: 150},

 

    defaultType:  'textfield',

 

    items  :[{

 

       fieldLabel: '爱好',

 

       name:  'hobby',

 

       value:  'www.cnblogs.com'

 

    },{

 

       xtype:"combo",

 

       name:  'sex',

 

       store:["男","女","保密"],//数据源为一数组

 

       fieldLabel:"性别",

 

       emptyText:'请选择性别.'

 

    }]

 

}]

 

这里的combox组件只是简单的演示,具体还是要深入了解,我们会在以后的内容中详细探讨.

2.  关于xtype的类型,在extjs的form表单(其他的请参考api)中已经定义的有:

Form components

a)   form             Ext.FormPanel

b)   checkbox         Ext.form.Checkbox

c)   combo            Ext.form.ComboBox

d)   datefield        Ext.form.DateField

e)   field            Ext.form.Field

f)   fieldset         Ext.form.FieldSet

g)   hidden           Ext.form.Hidden

h)   htmleditor       Ext.form.HtmlEditor

i)   label            Ext.form.Label

j)   numberfield      Ext.form.NumberField

k)   radio            Ext.form.Radio

l)   textarea         Ext.form.TextArea

m)   textfield        Ext.form.TextField

n)   timefield        Ext.form.TimeField

o)   trigger          Ext.form.TriggerField

不早了,FormPanel还有很多的东西要了解,但是今天不能再讲了,太多了,大家都没有兴致看下去,明天继续.

extjs的东西很庞大,但是还没有一个人用中文系统的分析写文章,所以资料都很可贵,现在我想做这件事,请大家多多支持,我才有动力.

 

 

 

 

 

   

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(5)--Ext.FormPanel之第二式

3.  可选的fieldset实例

其实就是带个chechbox,有点像论坛注册时有一部分是选填信息的那种效果,主要知识点:

l  checkboxToggle:true//true则呈现一个带checkbox的fieldset,选中则展开,否则相反,默认为false

l checkboxName:string//当上面为true时,作为checkbox的name,方便表单操作

 
 

//在上一节的基础代码的items里面添加如下配置

 

{

 

    xtype:"fieldset",

 

    checkboxToggle:true,//关键参数,其他和以前的一样

 

    checkboxName:"dfdf",

 

    title:"选填信息",

 

    defaultType:'textfield',

 

    width:330,

 

    autoHeight:true,//使自适应展开排版

 

    items:[{

 

       fieldLabel:"UserName",

 

       name:"user",

 

       anchor:"95%"//330px-labelWidth剩下的宽度的95%,留下5%作为后面提到的验证错误提示

 

    },{

 

       fieldLabel:"PassWord",

 

       inputType:"password",//密码文本

 

       name:"pass",

 

       anchor:"95%"

 

    }]

 

}

 

4. 表单验证实例(空验证,密码确认验证,email验证)

我们可以用单独的js写表单验证,但是extjs已经为我们想到了(自己单独写反而不方便).

在验证之前,我不得不提两个小知识点(大家在很多的extjs代码中都看到了这两个,他们都起提示作用的):

l  Ext.QuickTips.init();    //支持tips提示

l  Ext.form.Field.prototype.msgTarget='side';

//提示的方式,枚举值为"qtip","title","under","side",id(元素id)

//side方式用的较多,右边出现红色感叹号,鼠标上去出现错误提示,其他的我就不介绍了,可自行验证

大家可以分别去掉这两行代码,看效果就会明白他们的作用,(放在onReady的function(){}中)

² 我们看一个最简单的例子:空验证(其实这不算是一个专门的验证例子)

//空验证的两个参数

a)  allowBlank:false//false则不能为空,默认为true

b)   blankText:string//当为空时的错误提示信息

js代码为:

 
 

var form1  = new Ext.form.FormPanel({

 

    width:350,

 

    frame:true,

 

    renderTo:"form1",

 

    labelWidth:80,

 

    title:"FormPanel",

 

    bodyStyle:"padding:5px 5px 0",

 

    defaults:{width:150,xtype:"textfield",inputType:"password"},

 

    items:[{

 

       fieldLabel:"不能为空",

 

       allowBlank:false,//不允许为空

 

       blankText:"不能为空,请填写",//错误提示信息,默认为This field  is required!

 

       id:"blanktest",

 

       anchor:"90%"

 

    }]

 

});

 

²  用vtype格式进行简单的验证.

在此举邮件验证的例子,重写上面代码的items配置:

 
 

items:[{

 

    fieldLabel:"不能为空",

 

    vtype:"email",       //email格式验证

 

    vtypeText:"不是有效的邮箱地址",//错误提示信息,默认值我就不说了

 

    id:"blanktest",

 

    anchor:"90%"

 

}]

 

你可以修改上面的vtype为以下的几种extjs的vtype默认支持的验证:

l  alpha //只能输入字母,无法输入其他(如数字,特殊符号等)

l  alphanum//只能输入字母和数字,无法输入其他

l  email//email验证,要求的格式是langsin@gmail.com

l  url//url格式验证,要求的格式是http://www.langsin.com

²  确认密码验证(高级自定义验证)

前面的验证都是extjs已经提供的验证,我们也可以自定义验证函数,比上面要复杂点了.我们一起做一个密码确认的例子.

我们修改前面的代码:

 
 

//先用Ext.apply方法添加自定义的password验证函数(也可以取其他的名字)

 

Ext.apply(Ext.form.VTypes,{

 

    password:function(val,field){

 

       //val指这里的文本框值,field指这个文本框组件,大家要明白这个意思

 

       if(field.confirmTo){

 

           //confirmTo是我们自定义的配置参数,一般用来保存另外的组件的id值

 

           var pwd=Ext.get(field.confirmTo);//取得confirmTo的那个id的值

 

           return (val==pwd.getValue());

 

       }

 

       return  true;

 

    }

 

});

 

//配置items参数

 

items:[{

 

    fieldLabel:"密码",

 

    id:"pass1",

 

    anchor:"90%"

 

},{

 

    fieldLabel:"确认密码",

 

    id:"pass2",

 

    vtype:"password",//自定义的验证类型

 

    vtypeText:"两次密码不一致!",

 

    confirmTo:"pass1",//要比较的另外一个的组件的id

 

    anchor:"90%"

 

}]

 

关于vtype的内容还有很多内容要挖掘,但现在我们就点到这里为止,以后有机会再讨论它的其他高级验证.

 

 

 

 

 

 

 

ExtJs2.0学习系列(6)-- Ext.FormPanel之第三式(ComboBox篇)

上篇ExtJs2.0学习系列(5)--Ext.FormPanel之第二式中我们讨论了下fieldset和表单验证的知识,今天我们接着深入解析表单元素中ComboBox组件的使用.会涉及到.net简单服务器数据交互,但暂不做深入讨论,以后会详细分析服务器交互相关,不过可能要等较长一段时间,呵呵!

5.  服务器数据作为ComboBox的数据源实例

首先从服务器获取json数据:

 
 

//cs后台代码,要注意字符串格式(新手注意,下面的代码放在类里面,不是放在方法里)

 

public String ServerData="['湖北','江西','安徽']";

 

//aspx前台js介绍代码

 

Ext.onReady(function(){

 

    var combo=new Ext.form.ComboBox({

 

       store:<%=ServerData%>,

 

       emptyText:'请选择一个省份....',

 

       applyTo:  'combo'

 

    });

 

});

 

<!-- aspx前台html代码 -->

 

<input type="text" id="combo" size="20"/>

 

我们就通过<%=ServerData%>这样的方式获取到了服务器最简单的属性数据.问题来了,js和html怎么调用c#后台

的变量和方法?(变量的调用上面刚刚介绍)

6.  js和html怎么调用c#后台的变量和方法

a)  js调用c#后台变量,参考上面,注意,如果想获取string类型,请在js里用引号 varstr="<%=ServerData%>"(返回"['湖北','江西','安徽']")

b)  js调用c#后台方法:

 
 

<!-- 后台有一个方法: -->

 

public String ServerData(){

 

    return "fdfdfdfdsf";

 

}

 

<!-- 前台代码: -->

 

<input id="Text2" type="text" value="<%=ServerData()%>"/>

 

c)  js调用c#后台带参数的方法

 
 

<!-- 主要是处理好js的引号问题,多尝试就会正确 -->

 

public String ServerData(String pram) {

 

    return pram+",我是参数传进来的";

 

}

 

<!-- js代码 -->

 

alert('<%=ServerData("谦虚的天下")%>');

 

7. ComboBox的数据源store格式详解

在前面的例子里面,我们一直给ComboBox的数据源store赋值一维数组,其实store支持多维和Store.data.Store类型.下面就几种数据以代码举例说明

一维数组:["江西","湖北"],值同时赋给ComboBox的value和text

二维和多维数组:[["one","bbar","111"],["two","tbar","222"]],第一维和第二维分别赋值给value和text,其他维忽略

store类型:包括GroupingStore, JsonStore, SimpleStore.

我们分三步走:

 
 

<!-- 第一步:提供数据 -->

 

var data=[['湖北','hubei'],['江西','jiangxi'],['安徽','anhui']];

 

<!-- 第二步:导入到store中 -->

 

var store  = new Ext.data.SimpleStore({

 

    fields: ['chinese',  'english'],

 

    data  : data

 

});

 

<!-- 第三步 :把store托付给comboBox的store  -->

 

var combo  = new Ext.form.ComboBox({

 

    store:store;

 

    //store字段是你要显示的字段,多字段必选参数,默认当mode为remote时dispalyField为undefine,当为select列表时dispalyField为text

 

    displayField:'english',

 

    mode:'local',//因为data已经取数据到本地了,所以'local',默认为"remote",枚举完

 

    emptyText:'请选择一个省份...',

 

    applyTo:'combo'

 

});

 

这里我们介绍了两个新的参数displayField和mode,请记住,后面不再专门说明.

8. ComboBox的value获取

添加listeners事件:

ComboBox的事件很多(api),我们无法一一讲解,但是我们可以举一反三,select事件就是其中典型的一个

 
 

listeners:{

 

    "select":function(){

 

       alert(Ext.get("combo").dom.value);    //获取id为combo的值

 

    }

 

}

 

这里我们提供了一种不是很好的方法,在此不做过多停留

9. 把Extjs的ComboBox样式应用到select的下拉框中去

核心参数介绍

transform:id  //用于转换样式的,TimeField作为ComboBox的子类也有此属性

核心代码:

 
 

//js代码

 

var ExtSelect=new Ext.form.ComboBox({

 

    transform:"select",//html中的id

 

    width:80//宽度

 

});

 

<!-- html代码 -->

 

<select id="select">

 

    <option value="1">浪曦</option>

 

    <option value="2">博客园</option>

 

    <option value="3">百度</option>

 

    <option value="4">新浪</option>

 

</select>

 

        

10.ComboBox的其他重要参数

a)  valueField:"valuefield"      //value值字段

b)  displayField:"field"         //显示文本字段

c)  editable:false               //false则不可编辑,默认为true

d)  triggerAction:"all"

//请设置为"all",否则默认为"query"的情况下,你选择某个值后,再此下拉时,只出现匹配选项,如果设为"all"的话,每次下拉均显示全部选项

e)  hiddenName:string           //真正提交时此combo的name,请一定要注意

f)  typeAhead:true,             //延时查询,与下面的参数配合

g)  typeAheadDelay:3000,     //默认250

关于combobox的其他花俏功能在此不多做介绍.

最后一点,如何实现在aspx页面更灵活的分离cs数据和js数据的交互?因为我们都喜欢把js放在一个单独的文件,然后在aspx页面引用

这样就有一个问题,我在js里直接获取cs数据就有点不方便.我认为可以这样,在aspx页面里获取数据,并作为js,你就js变量,你就可

以在js里引用了,或者直接通过url地址获取.

之所以这么啰嗦的讲combobox,是因为这个东西有时候真的让人又爱又恨!

下篇中我们继续讲解form中其他的表单元素!

 

 

 

 

 

 

 

ExtJs2.0学习系列(7)--Ext.FormPanel之第四式(其他组件示例篇)

11.checkbox简单示例

效果图:

js代码:

 
 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var myform=new Ext.FormPanel({

 

       frame:true,

 

       width:330,

 

       layout:"form",

 

       labelWidth:30,

 

       title:"checkbox简单示例",

 

       labelAlign:"left",

 

       renderTo:Ext.getBody(),

 

       items:[{

 

           xtype:"panel",

 

           layout:"column",//也可以是table,实现多列布局

 

           fieldLabel:'爱好',

 

           isFormField:true,//非常重要,否则panel默认不显示fieldLabel

 

           items:[{

 

              columnWidth:.5,//宽度为50%

 

              xtype:"checkbox",

 

              boxLabel:"足球",//显示在复选框右边的文字

 

              name:""

 

              },{

 

              columnWidth:.5,

 

              xtype:"checkbox",

 

              boxLabel:"篮球",

 

              name:""

 

           }]

 

       }]

 

    });

 

});

 

关于多列布局,我们可以使用column或者table布局解决!

a)  checked:true//true则选中,默认为false

b)  name:"**"//name值

c)  value:"" //初始化值,默认为undefine

12.radio简单示例

基本上和checkbox一样,不过注意一组单选框必须name值相同,才能单选.

效果图:

代码:

 
 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var myform=new Ext.FormPanel({

 

       frame:true,

 

       width:330,

 

       layout:"form",

 

       labelWidth:30,

 

       title:"radio简单示例",

 

       labelAlign:"left",

 

       renderTo:Ext.getBody(),

 

       items:[{

 

           xtype:"panel",

 

           layout:"column",

 

           fieldLabel:'性别',

 

           isFormField:true,

 

           items:[{

 

              columnWidth:.5,

 

              xtype:"radio",

 

              boxLabel:"男",

 

              name:"sex"

 

              //inputValue

 

           },{

 

              columnWidth:.5,

 

              checked:true,

 

              xtype:"radio",

 

              boxLabel:"女",

 

              name:"sex"

 

           }]

 

       }]

 

    });

 

});

 

13.htmleditor简单示例

效果图:

js代码:

 
 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var myform=new Ext.FormPanel({

 

       frame:true,

 

       width:600,

 

       layout:"form",

 

       labelWidth:50,

 

       title:"htmleditor简单示例",

 

       labelAlign:"top",//items中的标签的位置

 

       renderTo:Ext.getBody(),

 

       items:[{

 

           xtype:"htmleditor",

 

           id:"he",

 

           fieldLabel:"编辑器",

 

           anchor:"99%"

 

       }]

 

    });

 

});

 

在这里我啰嗦个参数:

u  labelAlign:此参数是指form表单中items各项的label位置,默认值为left,枚举值有left,right,top

我看见过有朋友认为此参数指title的位置,是错误的!

几个其他的参数:

a)  hideLabel:true//默认为false,还适用于有标签的所有表单组件

//下面的一组参数控制编辑器的工具栏选项,都是默认值为true

b)  enableColors:true//默认为true,显示字体颜色,字体背景颜色

c)  enableAlignments:true//左,中,右对齐

d)  enableFont:true//字体

e)  enableFontSize:false//字体大小,就是A旁边有个小箭头的

f)  enableFormat:false//粗体,斜体,下划线

g)  enableLinks:true//链接

h)  enableLists:true//列表

i)  enableSourceEdit:true//源代码编辑

14.datefield简单示例

效果图:

js代码:

 
 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var myform=new Ext.FormPanel({

 

       frame:true,

 

       width:200,

 

       layout:"form",

 

       labelWidth:30,

 

       title:"dateditor简单示例",

 

       labelAlign:"left",

 

       renderTo:Ext.getBody(),

 

       items:[{

 

           xtype:"datefield",

 

           fieldLabel:"生日",

 

           anchor:"99%"

 

       }]

 

    });

 

});

 

15.timefield简单示例

把上面的例子中datefield改为timefield,效果图:

16.numberfield简单示例:

把上面的datefield改为numberfield,就只能输入数字了

17.triggerfield简单示例

说明:它提供了一个触发的事件onTriggerClick,datefield和combox都是继承它

效果图:(点击右边下拉按钮)

js代码:

 
 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var myform=new Ext.FormPanel({

 

       frame:true,

 

       width:200,

 

       layout:"form",

 

       labelWidth:30,

 

       title:"triggerfield简单示例",

 

       labelAlign:"left",

 

       renderTo:Ext.getBody(),

 

       items:[{

 

           xtype:"trigger",

 

           fieldLabel:"触发",

 

           anchor:"99%",

 

           onTriggerClick:function(e){

 

              //在这里写你要实现的事件,很容易扩展

 

              alert("www.langsin.com");

 

           }

 

       }]

 

    });

 

});

 

好了,关于form的几个基本组件我们都蜻蜓点水的看了一遍,相信大家感性上知道是怎么回事啦!(总算快写完了formpanel)

前面有朋友说要做个一行多个控件,中间有文字的那种form布局,谢谢支持!

下篇我们就做一个复杂点的form组件,还能提交服务器的综合示例!敬请期待!

 

 

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(8)--Ext.FormPanel之第五式(综合篇)

上篇和前面的介绍中,我们基本上对form表单中常见组件有了简单的认识,今天我们做个综合点的例子,向服务器提交下!

其实这篇文章很简单,没有什么发光点,暂放首页半天,忘各位理解!

先来个简单的例子,以说明formpanel如何把数据传给其他页面.

效果图:

现在我们要实现的效果是:点击确定,把值传到另一页面!,如下:

原页面js代码为:

 
 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var form=new Ext.FormPanel({

 

       frame:true,

 

       width:300,

 

       //monitorValid:true,//绑定验证

 

       layout:"form",

 

       labelWidth:70,

 

       title:"添加个人信息",

 

       labelAlign:"left",

 

       renderTo:Ext.getBody(),

 

       submit:  function(){

 

           this.getEl().dom.action = 'GetForm.aspx',

 

           this.getEl().dom.method='POST',

 

           this.getEl().dom.submit();

 

       },

 

       items:[{

 

           xtype:"textfield",

 

           fieldLabel:"用户名",

 

           //id:"UserName",

 

           allowBlank:false,

 

           blankText:"不能为空,请正确填写",

 

           name:"UserName",

 

           anchor:"90%"

 

       },{

 

           xtype:"textfield",

 

           fieldLabel:"昵称",

 

           //id:"SmallName",

 

           name:"SmallName",

 

           anchor:"90%"

 

       },{

 

           xtype:"datefield",

 

           fieldLabel:"注册日期",

 

           //id:"RegDate",

 

           name:"RegDate",

 

           anchor:"90%"

 

       }],

 

    });

 

});

 

接受页面GetForm.aspx的cs代码为:

 
 

protected void Page_Load(Object sender, EventArgs e){

 

String  UserName = Request.Form["UserName"];

 

String  SmallName = Request.Form["SmallName"];

 

String  RegDate = Request.Form["RegDate"];

 

Response.Write(UserName  + "<br/>" + SmallName + "<br/>" + RegDate);

 

}

 

因为很简单,我做个简要说明:

//几点说明

1.   首先定义submit参数的执行函数,即:

 
 

submit: function(){

 

    this.getEl().dom.action = 'GetForm.aspx',//转向页面地址

 

    this.getEl().dom.method='POST',//方式

 

    this.getEl().dom.submit();//提交!

 

},

 

2.   为按钮添加触发相应的提交(取消)事件(这样就不是默认的ajax提交):

 
 

buttons:[{text:"确定",handler:login,formBind:true},{text:"取消",handler:reset}]});

 

function login(){

 

    form.form.submit();//提交

 

}

 

function reset(){

 

    form.form.reset();//取消

 

}

 

3.   如果你想绑定验证,在form表单添加参数monitorValid:true,然后在按钮配置参数中添加formBind:true,如

buttons:[{text:"确定",handler:login,formBind:true},{text:"取消",handler:reset}]

则只有所有的填写字段都满足条件时,"确定"方可提交!如下图,

好了,一个简单的formpanel的提交的原理弄清楚啦!

有关form提交数据的方法有多种,大家可以参考http://www.17ext.com/showtopic-55.aspx(三种ext提交数据的方式),

下面我们来做个复杂点(只是样子)的form,示例一下(还是上面的原理)!

效果图:

传到GetForm.aspx页面后显示:

不过在传过来的页面要记得ValidateRequest="false",安全编码我就暂且不讨论了!

js代码:

 
 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var form=new Ext.FormPanel({

 

       frame:true,

 

       width:500,

 

       monitorValid:true,//把有formBind:true的按钮和验证绑定

 

       layout:"form",

 

       labelWidth:55,

 

       title:"添加个人信息",

 

       labelAlign:"right",

 

       renderTo:Ext.getBody(),

 

       submit:  function(){

 

           this.getEl().dom.action = 'GetForm.aspx',

 

           this.getEl().dom.method='POST',

 

           this.getEl().dom.submit();

 

       },

 

       items:[{

 

           xtype:"panel",

 

           layout:"column",

 

           fieldLabel:"用户名",

 

           isFormField:true,

 

           items:[{

 

              columnWidth:.5,

 

              xtype:"textfield",

 

              allowBlank:false,

 

              blankText:"不能为空,请填写",

 

              name:"UserName",

 

              anchor:"90%"

 

           },{

 

              columnWidth:.20,

 

              layout:"form",

 

              labelWidth:40,

 

              labelAlign:"right",

 

              items:[{

 

                  xtype:"radio",

 

                  fieldLabel:"性别",

 

                  boxLabel:"男",

 

                  name:"Sex",

 

                  checked:true,

 

                  inputValue:"man",

 

//这里如果用value,值是on,所以用inputValue(出现这种情况的是radio,checkbox)

 

                  anchor:"95%"

 

              }]

 

           },{

 

              columnWidth:.30,

 

              layout:"form",

 

              labelWidth:1,//让标签宽度为很小的值(奇怪的是为0时反而不行)

 

              items:[{

 

                  xtype:"radio",

 

                  boxLabel:"女",

 

                  labelSeparator:"",//去除分隔符”:”

 

                  name:"Sex",

 

                  inputValue:"woman",

 

                  anchor:"95%"

 

              }]

 

           }]

 

       },{//上面是第一行

 

       xtype:"panel",

 

       layout:"column",

 

       fieldLabel:"出生日期",

 

       isFormField:true,

 

       items:[{

 

           columnWidth:.5,

 

           xtype:"datefield",

 

           name:"BirthDate",

 

           anchor:"90%"

 

       },{

 

           columnWidth:.5,

 

           layout:"form",

 

           labelWidth:40,//注意,这个参数在这里可以调整简单fieldLabel的布局位置

 

           items:[{

 

              xtype:"combo",

 

              name:"Degree",

 

              fieldLabel:"学位",

 

              store:["小学","初中","高中","专科","本科","硕士","博士"],

 

              emptyText:"请选择适合你的学历",

 

               anchor:"90%"

 

           }]

 

       }]

 

       },{        //上面是第二行

 

           xtype:"panel",

 

           layout:"column",

 

           isFormField:true,

 

           fieldLabel:"使用框架",

 

           items:[{

 

              columnWidth:.2,

 

              xtype:"checkbox",

 

              boxLabel:"Spring.net",

 

              name:"SpringNet",

 

              inputValue:"spring"//这里如果用value,值是on,所以用inputValue

 

           },{

 

              columnWidth:.2,

 

              layout:"form",

 

              labelWidth:1,

 

              items:[{

 

                  xtype:"checkbox",

 

                  boxLabel:"Nhibernate",

 

                  labelSeparator:"",

 

                  name:"NHibernate",

 

                  inputValue:"nhibernate",

 

                  anchor:"95%"

 

              }]

 

           },{

 

              columnWidth:.6,

 

              layout:"form",

 

              labelWidth:1,

 

              items:[{

 

                  xtype:"checkbox",

 

                  boxLabel:"Linq",

 

                  labelSeparator:"",

 

                  name:"Linq",

 

                  inputValue:"linq",

 

                  anchor:"95%"

 

              }]

 

           }]

 

       },{        //上面是第三行

 

           xtype:"textfield",

 

           fieldLabel:"Email",

 

           name:"Email",

 

           vtype:"email",//email验证,如果想自定义验证的话,请参见前面的文章

 

           vtypeText:"email格式错误!",

 

           anchor:"56%"//控制文本框的长度

 

       },{        //上面是第四行xtype:"textarea",

 

           fieldLabel:"个性签名",

 

           name:"OneWord",

 

           height:50,

 

           anchor:"95%"

 

       },{        //上面是第五行

 

           xtype:"htmleditor",

 

           fieldLabel:"想说的话",

 

           name:"WantToSay",

 

           anchor:"95%",

 

           enableAlignments:false,//去除左右对齐工具栏

 

           enableLists:false//去除列表工具栏

 

       }],

 

       buttons:[{text:"确定",handler:login,formBind:true},{text:"取消",handler:reset}]

 

    });

 

    function login(){

 

       form.form.submit();

 

    }

 

    function  reset(){

 

       form.form.reset();

 

    }

 

});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(9)--Ext.TabPanel之第一式

照旧,看个最简单的先,后面再详细说复杂的!

效果图片:

js代码:

 
 

Ext.onReady(function(){

 

    var tabsDemo=new Ext.TabPanel({

 

       renderTo:Ext.getBody(),

 

       width:300,

 

       activeTab:0,//当前激活标签

 

       frame:true,

 

       items:[{

 

           contentEl:"tabOne",//标签页的页面元素id(加入你想显示的话)

 

           title:"浪曦",

 

           closable:true//是否现实关闭按钮,默认为false

 

       },{

 

           contentEl:"tabTwo",

 

           title:"博客园兄弟们可好"

 

       }]

 

    });

 

});

 

html代码:

 
 

<!-- html代码 -->

 

<body style="margin:10px;">

 

    <div>

 

       <div id="tabOne" class="x-hide-display">i am tabOne!</div>

 

       <div id="tabTwo" class="x-hide-display">i am tabTwo!</div>

 

    </div>

 

</body><!--注意class类型,设为x-hide-display,以正常显示-->

 

在这里例举几个参数:

l tabPosition:"bottom"//选项卡的位置,枚举值bottom,top.默认为top(只有top的时候才能选项卡的滚动!)

l tabTip:"提示"//必须先调用Ext.QuickTips.init();才有效果

经常我们有这么个情况,一个选项卡加载一个页面,这里我提供一种不是很好但是很稳定的简单方法(已经在项目中验证没有出现问题).

就是:使用iframe作为tab的标签页内容.

1.  用iframe加载其他完整页面的tabpanel.

效果图:

点击链接"换成博客园",

html代码:

 
 

<body style="margin:10px;">

 

    <div>

 

       <a href="javascript:void(0)"

 

        οnclick="parent.frames['mainFrame'].location='http://www.cnblogs.com'">换成博客园</a>

 

       <iframe id="mainFrame" name="mainFrame" src="http://www.baidu.com"

 

           frameborder="0"  height="100%" width="100%" style="overflow:hidden;"></iframe>

 

    </div>

 

</body>

 

js代码:

 
 

Ext.onReady(function(){

 

    var tabsDemo=new Ext.TabPanel({

 

       renderTo:Ext.getBody(),

 

       activeTab:0,

 

       height:700,//当用viewport布局时,这个height可以省去

 

       frame:true,

 

       items:[{

 

           contentEl:"mainFrame",

 

           tabTip:"fengjian",

 

           title:"加载页面的标签页",

 

           closable:true

 

       }]

 

    });

 

});

 

今天的内容简单.就暂且说做到了这里,下篇中我们说说tabpanel的滚动标签和动态添加标签的tabpanel!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(10)--Ext.TabPanel之第二式

2.  动态添加tabpanel的标签页

效果图:

点击"添加新标签页",会添加一个标签页,而且激活这个新的标签页.

html代码:

 
 

<body style="margin:10px;">

 

    <div>

 

       <a id="AddNewTab" href="javascript:void(0)">添加新标签页</a>

 

    </div>

 

</body>

 

js代码:

 
 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var tabsDemo=new Ext.TabPanel({

 

       renderTo:Ext.getBody(),

 

       activeTab:0,

 

       height:700,

 

       frame:true,

 

       items:[{

 

           title:"autoLoad为html简单页面演示",

 

           autoLoad:{url:"tab1.htm",scripts:true}

 

       }]

 

    });

 

    //下面是添加新标签页的关键代码,很简单方便

 

    var index=0;

 

    Ext.get("AddNewTab").on("click",function(){

 

       tabsDemo.add({

 

           title:"newtab",

 

           id:"newtab"+index,

 

           html:"new tab",

 

           closable:true

 

       });

 

       tabsDemo.setActiveTab("newtab"+index);

 

       index++;

 

    })

 

});

 

简单说明:

其实添加的话,只要add()方法就可以了,但是我们还要激活这个新的标签页,就必须setActiveTab(newtab的索引或id),关键就是我们不好判断这个索引,所以只好设置个递增的全局变量index来给newtab取名,这样我们也就能准确的获取新的不重复的newtab了,也就容易激活了.而且我们可以通过下图看出来.

   

3. 稍微修改上面的例子tabpanel(官方的例子)

效果图:

我就不多说了,关键的几个参数注释了下

 
 

<body style="margin:10px;">

 

    <div>

 

       <div id="AddBtn"></div>

 

    </div>

 

</body>

 

js代码:

 
 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var tabsDemo=new Ext.TabPanel({

 

       renderTo:Ext.getBody(),

 

       //resizeTabs:true,宽度能自动变化,但是影响标题的显示

 

       activeTab:0,

 

       height:200,

 

       enableTabScroll:true,//挤的时候能够滚动收缩

 

       width:200,

 

       frame:true,

 

       items:[{

 

           title:"tab advantage",

 

           html:"sample1"

 

       }]

 

    });

 

    var index=0;   

 

    //就是下面这个函数,关键的地方,非常简单也非常实用

 

    function addTab(){

 

       tabsDemo.add({

 

           title:"newtab",

 

           id:"newtab"+index,

 

           html:"new tab"+index,

 

           closable:true

 

       });

 

       tabsDemo.setActiveTab("newtab"+index);

 

       index++;

 

    }

 

    //设置一个按钮(上面的是一个链接,应用有点不同哦)

 

    new Ext.Button({

 

       text:"添加新标签页",

 

       handler:addTab

 

    }).render(document.body,"AddBtn");

 

});

 

4. 为tabpanel标签页添加右键菜单

效果图:

点击"关闭其他所有页"后,

其他两个右键菜单还是道理相同.

a)  enableTabScroll:true//前面已经说过了

b)  listeners:{"contextmenu":function(参数1,参数2,参数3){  .}}

//右键菜单事件,三个参数分别为当前tabpanel,当前标签页panle,时间对象e

c)  扩充2,每个标签页都有激活和去激活事件

activate和deactivate,他们的执行函数有个参数,就是当前标签页.

 
 

items:[{

 

    title:"tab advantage",

 

    listeners:{

 

       deactivate:function(a){alert("删除,a表示当前标签页");},

 

       activate:function(){alert("激活");}

 

    },

 

    html:"sample1"

 

}]

 

menu=new Ext.menu.Menu()//menu组件,就不多说了,后面会专门分析下,不过不要忘记menu.showAt(e.getPoint());了

html代码和上面的例子的html代码一样.

js代码:

 
 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var tabsDemo=new Ext.TabPanel({

 

       renderTo:Ext.getBody(),

 

       //resizeTabs:true,宽度能自动变化,但是影响标题的显示

 

       activeTab:0,

 

       height:200,

 

       enableTabScroll:true,//挤的时候能够滚动收缩

 

       width:400,

 

       frame:true,            //下面是比上面例子新增的关键右键菜单代码

 

       listeners:{

 

           //传进去的三个参数分别为:这个tabpanel(tabsDemo),当前标签页,事件对象e

 

           "contextmenu":function(tdemo,myitem,e){

 

              menu=new Ext.menu.Menu([{

 

                  text:"关闭当前页",

 

                  handler:function(){

 

                     tdemo.remove(myitem);

 

                  }

 

              },{

 

                  text:"关闭其他所有页",

 

                  handler:function(){

 

                     //循环遍历

 

                     tdemo.items.each(function(item){

 

                         if(item.closable&&item!=myitem){

 

                            //可以关闭的其他所有标签页全部关掉

 

                            tdemo.remove(item);

 

                         }

 

                     });

 

                  }

 

              },{

 

                  text:"新建标签页",

 

                  handler:addTab

 

              }]);

 

              //显示在当前位置

 

              menu.showAt(e.getPoint());

 

           }

 

       },

 

       items:[{

 

           title:"tab advantage",

 

           html:"sample1"

 

       }]

 

    });

 

    var index=0;

 

    function addTab(){

 

       tabsDemo.add({

 

           title:"ntab"+index,

 

           id:"newtab"+index,

 

           html:"new tab"+index,

 

           closable:true

 

       });

 

       tabsDemo.setActiveTab("newtab"+index);

 

       index++;

 

    }

 

    new Ext.Button({

 

       text:"添加新标签页",

 

       handler:addTab

 

    }).render(document.body,"AddBtn");

 

});

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(11)--Ext.XTemplate

XTemplate是Extjs里面的模板组件.

下面我们看个最简单的例子.

效果图:

js代码:

 
 

Ext.onReady(function(){

 

    //数据源

 

    var data={

 

       name:"博客园",

 

       read:[{

 

           book:'<<道不远人>>',

 

           date:'2007-7-7'

 

       },{

 

           book:"<<大话设计模式>>",

 

           date:"2006-6-6"

 

       }]

 

    }

 

    //呈现组件

 

    var mypanel=new Ext.Panel({

 

       width:400,

 

       id:"mypanel",

 

       title:"XtemplateData简单示例",

 

       renderTo:Ext.getBody()

 

    });

 

    //创建模板

 

    var tpl=new Ext.XTemplate(

 

       '<table><tr><th>名称:{name}</th></tr>',

 

       '<tr><td>',

 

       '<tpl for="read">',

 

       '<p>编号:{#},书:{book},日期:{date}</p>',

 

       '</tpl></td></tr></table>'

 

    );

 

    //重写绑定模板

 

    tpl.overwrite(mypanel.body,data);

 

});

 

a)  tpl.compile();//可以在创建模板后,添加tpl.compile();编译代码,速度快点.

b)  tpl.overwrite(mypanel.body,data);//把数据填充到模板中去,并呈现到目标组件

c)  名称:{name}//对于一维单数据对象,直接用{名称}输出,

d)  <tpl for="read">//对于多维对象(如拥有多条数据的表),使用tpl和for配合使用,会使用tpl的格式把数据一条一条输出,read为上级节点

e)  {.}//对于一维对数据的对象,如color: ['Red', 'Blue', 'Black'],可以用{.}按照tpl模板逐一输出,如: 

 
 

'<tpl for="color">',

 

    '<div> {.}</div>',

 

'</tpl>'

 

f)  {#}//表示循环的索引

g)  parent.***//在子对象中访问父对象元素,使用parent,如:{parent.name}

h)  if//'<tpl if="age &gt; 1">', 

            '<p>{name}</p>',

        '</tpl>',

    //if实现有条件的逻辑判断,很容易使用

i)  其他几个常用的参数:

xindex//循环模板的当前索引index(从1开始),用[]. 

xcount//循环模板循环的次数. 用[]

举例:

 
 

'<tpl for="read">',

 

    '<p>编号:{#},书:{book},日期:{date},奇偶:{[xindex%2==0?"偶数":"奇数"]},次数:{[xcount]}</p>',

 

'</tpl>

 

   模板成员函数(借用api下):

 
 

var tpl = new Ext.XTemplate(

 

    '<tpl for="kids">',

 

    '<tpl if="this.isGirl(name)">',

 

    '<p>Girl: {name} - {age}</p>',

 

    '</tpl>',

 

    '<tpl if="this.isGirl(name) ==  false">',

 

    '<p>Boy: {name} - {age}</p>',

 

    '</tpl>',

 

    '</tpl></p>', {

 

       isGirl: function(name){

 

           return  name == 'Sara Grace';

 

       },

 

       isBaby: function(age){

 

           return  age < 1;

 

       }

 

    }

 

);

 

接下来,我们做个服务器的例子(好像很多朋友对这个要求很强烈啊)

实例演示:用模板呈现服务器数据

效果图:

 
 

<!-- html代码 -->

 

<div id="container"></div>

 

<!-- css代码 -->

 

<style type="text/css">

 

    body{

 

       font-size:12px

 

    }

 

    #container{

 

       border:1px solid black;

 

       width:330px;

 

    }

 

    td,th{

 

       border-bottom:1px dashed black;

 

    }

 

    th{

 

       text-align:center;

 

    }

 

    .namewidth{

 

       width:120px;

 

    }

 

    .urlwidth{

 

       width:150px;

 

    }

 

</style>

 

<!-- js代码 -->

 

Ext.onReady(function(){

 

    var mydata;

 

    Ext.Ajax.request({

 

       url:"getXtemplateData.ashx",//服务器端地址

 

       success:function(request){

 

           mydata=request.responseText;//服务器端文本数据

 

           mydata=eval('('+mydata+')');//使用eval把文本数据转换为json对象

 

           //或者用extjs自带的方法:mydata=Ext.util.JSON.decode(mydata),效果相同

 

           var tpl2=new Ext.XTemplate(

 

              '<table><thead><tr><th>编号</th><th class=  "namewidth">名称</th><th class="urlwidth">地址</th>< th>位置</th></tr></thead><tbody>',

 

              '<tpl for="results">',

 

    '<tr><td>{#}</td><td>{linkname}</td><td>{linkurl}</td><td>{linkpos}</td><tr>',

 

              '</tpl></tbody></table>'

 

           );

 

           tpl2.compile();

 

           tpl2.overwrite(Ext.get("container"),mydata);

 

       },

 

       failure:function(){

 

       alert("failure!");

 

       }

 

    });

 

})

 

/*简单说明

1.Ext.Ajax.request(),这里暂且对ajax不多谈论,后面会详细叙述

2.eval用"()"可以把规范文本转换为json对象,很重要!mydata=eval('('+mydata+')');

3.如果我们把模板创建和绑定放到ajax外面,会出错,因为ajax为异步调用,记住哦~

4.关于success函数的request参数,我截个图看看,就明白了

*/

先看看数据库数据:

字段,数据都很清楚.下面是服务器getXtemplateData.ashx的代码:

 
 

<%@ WebHandler  Language="C#" Class="getXtemplateData" %>

 

using System;

 

using System.Web;

 

using System.Data;

 

using System.Data.SqlClient;

 

using System.Text;

 

 

 

public class  getXtemplateData : IHttpHandler {

 

    public void  ProcessRequest (HttpContext context) {

 

         StringBuilder tempResult = new StringBuilder("{results:[");

 

        string  connstr = @"Data Source=WIN-7JW7UWR0M27\MSSQL2005;Initial Catalog=xgc;Persist  Security Info=True;User ID=sa;Password=************";

 

         SqlConnection sqlconn = new SqlConnection(connstr);

 

         SqlCommand comm = new SqlCommand("select * from xLink", sqlconn);

 

         sqlconn.Open();

 

         SqlDataReader sdr = comm.ExecuteReader();

 

        while  (sdr.Read()){

 

             tempResult.Append("{id:'");

 

             tempResult.Append((int)sdr["id"]);

 

             tempResult.Append("',linkname:'");

 

             tempResult.Append((string)sdr["linkname"]);

 

             tempResult.Append("',linkurl:'");

 

             tempResult.Append((string)sdr["linkurl"]);

 

             tempResult.Append("',linkpos:");

 

             tempResult.Append((int)sdr["linkpos"]);

 

             tempResult.Append("},");

 

        }

 

         tempResult.Remove(tempResult.Length - 1, 1);//去掉多余的那个逗号

 

         tempResult.Append("]}");

 

         context.Response.Write(tempResult);//输出

 

    }

 

    public  bool IsReusable {

 

        get {

 

            return false;

 

        }

 

    }

 

}

 

今天对XTemplate做了个简单介绍,下篇我们开始TreePanel的学习讨论~!

最后推荐个网站:浪曦视频网 ,谢谢支持!

============补充==========

我们在上面对基础上作个查询:

html代码为:

 
 

<div id="head"><input id="linkid" type="text" /></div>

 

<div id="container"></div>

 

js代码在上面js的基础上添加下面部分:

 
 

new Ext.Button({

 

    text:"查询大于指定id值的记录",

 

    handler:function(){

 

       Ext.Ajax.request({

 

           url:"getXtemplateData.ashx?id="+Ext.get("linkid").dom.value,//获取文本框的值

 

           success:function(request){

 

              mydata=request.responseText;

 

              mydata=eval('('+mydata+')');

 

              tpl2.overwrite(Ext.get("container"),mydata);

 

           },

 

           failure:function(){

 

              alert("failure!");

 

           }

 

       });

 

    }

 

}).render(document.body,"head");

 

服务器GetTemplateData.ashx代码也要稍微修改下:

 
 

public void  ProcessRequest (HttpContext context) {

 

String sql="";

 

if (context.Request.QueryString["id"] != null) {

 

sql = "select * from xLink where id>"+Convert.ToString(context.Request.QueryString["id"]);

 

} else {

 

sql="select * from xLink";

 

}

 

StringBuilder  tempResult = new StringBuilder("{results:[");

 

String connstr = @"Data  Source=WIN-7JW7UWR0M27\MSSQL2005;Initial Catalog=xgc;Persist Security  Info=True;User ID=sa;Password=673592063@qq.com";

 

SqlConnection  sqlconn = new SqlConnection(connstr);

 

SqlCommand comm = new  SqlCommand(sql, sqlconn);

 

sqlconn.Open();

 

SqlDataReader sdr =  comm.ExecuteReader();

 

while (sdr.Read()){

 

tempResult.Append("{id:'");

 

tempResult.Append((int)sdr["id"]);

 

tempResult.Append("',linkname:'");

 

tempResult.Append((String)sdr["linkname"]);

 

tempResult.Append("',linkurl:'");

 

tempResult.Append((String)sdr["linkurl"]);

 

tempResult.Append("',linkpos:");

 

tempResult.Append((int)sdr["linkpos"]);

 

tempResult.Append("},");

 

}

 

tempResult.Remove(tempResult.Length  - 1, 1);

 

tempResult.Append("]}");

 

context.Response.Write(tempResult);

 

}

 

   

效果图:

代码有点乱!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(12)--Ext.TreePanel之第一式

我总是喜欢用最简单的例子开始,去理解最基本的使用方法,减少对i后面高级使用的干扰!

TreePanel是继承自Panel,所以很多在Panel中谈到的属性这里可能会一笔带过,如有问题,请参考ExtJs2.0学习系列(2)--Ext.Panel

1.        第一个静态树—简单的树

效果图:

 
 

<!-- html代码 -->

 

<div id="container"></div>

 

<!-- js代码 -->

 

Ext.onReady(function(){

 

    var mytree=new  Ext.tree.TreePanel({

 

       el:"container",//应用到的html元素id

 

       animate:true,//以动画形式伸展,收缩子节点

 

       title:"Extjs静态树",

 

       collapsible:true,

 

       rootVisible:true,//是否显示根节点

 

       autoScroll:true,

 

       autoHeight:true,

 

       width:150,

 

       lines:true,//节点之间连接的横竖线

 

       loader:new  Ext.tree.TreeLoader(),//

 

       root:new Ext.tree.AsyncTreeNode({

 

           id:"root",

 

           text:"根节点",//节点名称

 

           expanded:true,//展开

 

           leaf:false,//是否为叶子节点

 

           children:[{text:'子节点一',leaf:true},{id:'child2',text:'子节点二',children:[{text:"111"}]}]

 

       })

 

    });

 

    mytree.render();//不要忘记render()下,不然不显示哦

 

})

 

在这里,我谈一个问题:

/*只有loader和AsyncTreeNode才能使children显示出来,为什么?*/

我在api中没有找到答案,甚至连children都没有看到,但是在原代码中,我们可以确定这个事实,只有loader实例后, AsyncTreeNode的children才会被递归的添加(appendChild)到它的父节点下,所以象示例中的代码,一定要注意条件.

其他的子节点问题不受此限制!

a)  TreePanel基本配置参数:

b)  animate:true//展开,收缩动画,false时,则没有动画效果

c)  autoHeight:true//自动高度,默认为false

d)  enableDrag:true//树的节点可以拖动Drag(效果上是),注意不是Draggable

e)  enableDD:true//不仅可以拖动,还可以通过Drag改变节点的层次结构(drap和drop)

f)  enableDrop:true//仅仅drop

g)  lines:true//节点间的虚线条

h)  loader:Ext.tree.TreeLoader//加载节点数据

i)  root:Ext.tree.TreeNode//根节点

j)  rootVisible:false//false不显示根节点,默认为true

k)  trackMouseOver:false//false则mouseover无效果

l)  useArrows:true//小箭头

2.        通过TreeNode自定义静态树

例子1其实很受数据的限制,必须先要准备好数组对象,我们用另外的方式再写个例子,在写例子前,我们来学习下

TreeNode的基本配置参数:

a)   checked:false//true则在text前有个选中的复选框,false则text前有个未选中的复选框,默认没有任何框框

b)   expanded:fasle//展开,默认不展开

c)   href:"http:/www.cnblogs.com"//节点的链接地址

d)   hrefTarget:"mainFrame"//打开节点链接地址默认为blank,可以设置为iframe名称id,则在iframe中打开

e)   leaf:true//叶子节点,看情况设置

f)   qtip:"提示"//提示信息,不过要 Ext.QuickTips.init();下

g)   text:"节点文本"//节点文本

h)  singleClickExpand:true//用单击文本展开,默认为双击

效果图:

 
 

<!-- html代码 -->

 

<body style="margin:10px;">

 

<div id="container"></div>

 

<iframe name="mainFrame" id="mainFrame" height="100px" width="200px" src="jstest.htm"></iframe>

 

</body>

 

<!-- js代码 -->

 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var mytree=new Ext.tree.TreePanel({

 

       el:"container",

 

       animate:true,

 

       title:"Extjs静态树",

 

       collapsible:true,

 

       enableDD:true,

 

       enableDrag:true,

 

       rootVisible:true,

 

       autoScroll:true,

 

       autoHeight:true,

 

       width:150,

 

       lines:true

 

    });

 

    //根节点

 

    var root=new Ext.tree.TreeNode({

 

       id:"root",

 

       text:"控制面板",

 

       expanded:true

 

    });

 

    //第一个子节点及其子节点

 

    var sub1=new Ext.tree.TreeNode({

 

       id:"news",

 

       text:"新闻管理",

 

       singleClickExpand:true

 

    });

 

    sub1.appendChild(new Ext.tree.TreeNode({

 

       id:"addNews",

 

       text:"添加新闻",

 

       href:"http://www.baidu.com",

 

       hrefTarget:"mainFrame",

 

       qtip:"打开百度",

 

       listeners:{//监听

 

           "click":function(node,e){

 

              alert(node.text)

 

           }

 

       }

 

    }));

 

    sub1.appendChild(new Ext.tree.TreeNode({

 

       id:"editNews",

 

       text:"编辑新闻"

 

    }));

 

    sub1.appendChild(new Ext.tree.TreeNode({

 

       id:"delNews",

 

       text:"删除新闻"

 

    }));

 

    root.appendChild(sub1);

 

    root.appendChild(new Ext.tree.TreeNode({

 

       id:"sys",

 

       text:"系统设置"

 

    }));

 

    mytree.setRootNode(root);//设置根节点

 

    mytree.render();//不要忘记render()下,不然不显示哦

 

});

 

3.        用TreeLoader加载数据生成树

//这里只介绍TreeLoader的参数一个

dataUrl:"*****.**"//地址

url:"****.**"//url参数和dataUrl参数一样

效果图:

 
 

<!-- html代码 -->

 

<div id="container"></div>

 

<!-- js代码 -->

 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    var mytree=new Ext.tree.TreePanel({

 

       el:"container",

 

       animate:true,

 

       title:"简单Extjs动态树",

 

       collapsible:true,

 

       enableDD:true,

 

       enableDrag:true,

 

       rootVisible:true,

 

       autoScroll:true,

 

       autoHeight:true,

 

       width:150,

 

       lines:true,

 

       //这里简简单单的loader的几行代码是取数据的,很经典哦

 

       loader:new  Ext.tree.TreeLoader({

 

           dataUrl:"json.ashx"

 

       })

 

    });

 

    //根节点

 

    var root=new Ext.tree.AsyncTreeNode({

 

       id:"root",

 

       text:"控制面板",

 

       expanded:true

 

    });

 

    mytree.setRootNode(root);

 

    mytree.render();//不要忘记render()下,不然不显示哦

 

});

 

上面的代码中dataUrl地址为json.ashx的代码是怎样呢?

让我们先来思考一个问题:

/*---dataUrl的地址返回的内容必须为数组对象形式,但是.net页面如何返回这样的格式?---*/

我的解决方案:把.net数据转换为json对象.

 
 

using System.Web.Script.Serialization;

 

public String ToJson(object  o){

 

    JavaScriptSerializer  j = new JavaScriptSerializer();

 

    return j.Serialize(o);

 

}

 

这里的o,我们可以定义个类的对象,传进去,转换为json对象

json.ashx代码:

 
 

using System;

 

using System.Web;

 

using System.Collections.Generic;

 

using System.Web.Script.Serialization;

 

 

 

public class jsondata{

 

    //定义jsondata类,存放节点数据

 

    public String  id;

 

    public String  text;

 

    public  bool leaf;

 

    public  List<jsondata>  children=new List<jsondata>();//存放子节点

 

}

 

 

 

public class  json : IHttpHandler {

 

    public  List<jsondata>  jsdata=new List<jsondata>();

 

    public void  ProcessRequest (HttpContext context) {

 

       for (int i  = 1; i < 5; i++){

 

           jsondata jd = new jsondata();

 

           jd.id="num"+i;

 

           jd.text  = "节点"+i;

 

           jd.leaf  = false;

 

           for (int j  = 1; j < 3; j++){

 

              jsondata subjd = new jsondata();

 

              subjd.id  = "sub" + j;

 

              subjd.text  = "子节点" + j;

 

              subjd.leaf  = true;

 

              jd.children.Add(subjd);

 

           }

 

           jsdata.Add(jd);

 

       }

 

       context.Response.Write(ToJson(jsdata.ToArray()));//ToArray()在IE里面好像缺了不行

 

    }

 

    public  bool IsReusable {

 

       get {

 

           return false;

 

       }

 

    }

 

    public String  ToJson(object o){

 

       //序列化对象为json数据,很重要!

 

       JavaScriptSerializer  j = new JavaScriptSerializer();

 

       return  j.Serialize(o);

 

    }

 

}

 

异步获取它的数据:

这里是模拟出数据,从数据库中取出数据再处理为节点数据 ,一个道理!

今天我们算是对TreePanel的最基本的使用有个基础的认识,谢谢支持!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(13)--Ext.TreePanel之第二式

昨天有朋友说,在IE下有的时候ashx传过来的节点不能加载,其实我也出现这样的问题,很是烦人!今天extjs上看到了一个解决方案,觉得很好:如果treeLoader加载失败,会继续加载,直到成功加载.

1.        解决IE下非正常加载节点问题

即使从服务器取到大量的数据,也没有问题.

  ......   

基本代码一样,只有js代码的loader小小的修改下:

 
 

loader:new  Ext.tree.TreeLoader({

 

    url:"json.ashx",

 

    listeners:{

 

       "loadexception":function(loader,node,response){

 

           node.loaded = false;

 

           node.reload.defer(10,node);//不停的加载,直到true

 

       }

 

    }

 

})

 

2.        使用TreeNodeUI

在node中我们可以用专门的类控制node的UI.

//TreeNodeUI的基本配置参数,node.getUI()=>TreeNodeUI

a)  addClass("class")//添加css类

b)  getAnchor()//返回a元素(对象),控制a链接

c)  getIconEl()//返回img元素(对象),控制icon图标

d)  getTextEl()//返回span元素(对象),控制节点文本

e)  hide()

f)  show()

g)  removeClass()

我们来做个例子,不过我先推荐个网站extjs中文社区,感觉就是内容太少了

例子:动态改变节点的icon图标

关键js代码:

 
 

<!-- 以根节点为例 -->

 

root.on("click",function(node){

 

    node.getUI().getTextEl().innerHTML="点击后";//a元素(对象)

 

    node.getUI().getIconEl().src="Image/add.gif";//img元素(对象)

 

});

 

效果图:

再来看看节点node.getUI().getTextEl()到底是什么?firebug下,

node.getUI().getIconEl()的内容:

其他类似.

3.        带有checkbox的树

类似vista下IIS7.0的配置(就是带有checkbox的哦)

先看几个关键字:

//关键代码

a)  node.getUI().checkbox.checked//返回节点选择,true和fasle

b)  用.net书写json文本,引用两个dl:Jayrock.dll和Jayrock.Json.dll,我会在后面提供下载

 
 

using Jayrock;

 

using Jayrock.Json;

 

using Jayrock.JsonRpc;

 

//使用Jayrock的JsonTextWriter可以书写json文本

 

c)  checkchange事件,选择变化时激发

看个简单的效果图:

两个问题:

l 如何隐藏复选框前的文件夹等小图标?

//答:图标img元素的css的class名为x-tree-node-icon,把display设为none就可以了

l  如何使用Jayrock.dll和Jayrock.json.dll把字符串转换为json对象?

 
 

using (JsonTextWriter writer = new JsonTextWriter(context.Response.Output)){

 

writer.WriteStartArray();//[

 

writer.WriteStartObject();//{

 

writer.WriteEndObject();//}

 

writer.WriteEndArray();//]

 

writer.WriteMember("text");//"text":

 

writer.WriteString("节点3");//节点三

 

writer.WriteMember("checked");

 

writer.WriteBoolean(false);//bool值

 

...

 

...

 

 }

 

详细请参见

http://msdn.microsoft.com/zh-cn/library/bb299886.aspx#intro_to_json_topic5

/*很罗嗦,我为什么要这么做?

其实我也不想这么罗嗦,但是我用下面两种方法

1)   用ashx字符串拼接返回的文本,没有成功!

2)   类对象序列化json,因为checked为C#的关键字,定义一个含checked字段的类,我没有成功!

只好用这么繁琐的办法,请高手有什么好的建议,多多指点!

*/

css代码:

 
 

<!-- 隐藏节点前的图标 -->

 

<style type="text/css">

 

.x-tree-node-icon{

 

    display:none;

 

}

 

</style>

 

<!-- html代码 -->

 

<body style="margin:10px;">

 

    <div id="container"></div>

 

    <div id="btn"></div>

 

</body>

 

<!-- js代码 -->

 

Ext.onReady(function(){

 

    Ext.QuickTips.init();

 

    Ext.BLANK_IMAGE_URL="ExtJs/resources/images/default/s.gif";

 

    function mytoggleChecked(node){

 

       //迭代复选=>父节点影响子节点选择,子节点不影响父节点

 

       if(node.hasChildNodes()){

 

           //eachChild(fn),遍历函数

 

           node.eachChild(function(child){

 

               child.getUI().toggleCheck(node.attributes.checked); 

 

              child.attributes.checked  = node.attributes.checked;

 

              //child.getUI().checkbox.checked=node.getUI().checkbox.checked;//有其父必有其子

 

              child.on("checkchange",function(sub){

 

                  mytoggleChecked(sub);//传递子节点

 

              });

 

              mytoggleChecked(child);//处理子节点(第三级,有点晕阿)

 

           })

 

       }

 

    }

 

    var mytree=new  Ext.tree.TreePanel({

 

       el:"container",

 

       animate:true,

 

       title:"简单Extjs动态树",

 

       collapsible:true,

 

       enableDD:true,

 

       enableDrag:true,

 

       rootVisible:true,

 

       autoScroll:true,

 

       autoHeight:true,

 

       width:150,

 

       lines:true,

 

       loader:new Ext.tree.TreeLoader({

 

           url:"checkjson.ashx",

 

           listeners:{

 

              "loadexception":function(loader,node,response){

 

                  //加载服务器数据,直到成功

 

                  node.loaded = false;

 

                  node.reload.defer(10,node);

 

              }

 

           }

 

       })

 

    });

 

    //根节点

 

    var root=new Ext.tree.AsyncTreeNode({

 

       id:"root",

 

       text:"根节点",

 

       checked:false,

 

       listeners:{

 

           "checkchange":function(node){//选中是否切换激发事件

 

              mytoggleChecked(node);//自定义级联选择函数

 

           }

 

       },

 

       expanded:true

 

    });

 

    mytree.setRootNode(root);

 

    mytree.render(); 

 

    root.expand(true);

 

    new Ext.Button({

 

       text:"选中id",

 

       handler:function(){

 

           var b=mytree.getChecked();

 

           var checkid=new Array;//存放选中id的数组

 

           for(var i=0;i<b.length;i++){

 

              if(b[i].leaf){

 

                  checkid.push(b[i].id);//添加id到数组

 

              }

 

           }

 

           alert(checkid.toString());//checkid.toString()这个结果,我们可以传到服务器,想怎么处理就怎么处理

 

       }

 

    }).render(document.body,"btn");

 

})

 

checkjson.ashx代码:

 
 

//先添加引用两个Jayrock.Json.dll和Jayrock.dll

 

<%@ WebHandler Language="C#" Class="checkjson" %>

 

using System;

 

using System.Web;

 

using System.Text;

 

//添加Jayrock命名空间

 

using Jayrock;

 

using Jayrock.Json;

 

using Jayrock.JsonRpc;

 

public class checkjson : IHttpHandler {

 

public void ProcessRequest(HttpContext context){

 

using (JsonTextWriter writer = new JsonTextWriter(context.Response.Output)){

 

//下面的代码好顶啊,算了,朋友,不想看了,就别看这个例子,我自己都有点看不下去了

 

writer.WriteStartArray();

 

//111

 

writer.WriteStartObject();

 

writer.WriteMember("text");

 

writer.WriteString("节点3");

 

writer.WriteMember("id");

 

writer.WriteString("id_1");

 

writer.WriteMember("checked");

 

writer.WriteBoolean(false);

 

//111—111

 

writer.WriteMember("children");

 

writer.WriteStartArray();

 

writer.WriteStartObject();

 

writer.WriteMember("id");

 

writer.WriteString("id_1_1");

 

writer.WriteMember("text");

 

writer.WriteString("子节点1");

 

writer.WriteMember("checked");

 

writer.WriteBoolean(false);

 

//111-111-111

 

writer.WriteMember("children");

 

writer.WriteStartArray();

 

writer.WriteStartObject();

 

writer.WriteMember("id");

 

writer.WriteString("id_1_1_1");

 

writer.WriteMember("text");

 

writer.WriteString("子节点1");

 

writer.WriteMember("leaf");

 

writer.WriteBoolean(true</SPA

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ExtJs2.0学习系列(14)--Ext.TreePanel之第三式(可增删改的树)

继续tree的learn! 今天就来个可增删改的树吧,操作数据库就使用比较方便的Linq,无非就是增删改!

LinqData.dbml:

 
 

<!-- html代码 -->

 

<body>

 

    <div id="container" style="float:left; margin-right:10px;">

 

    </div>

 

    <iframe name="mainFrame" id="mainFrame"

 

    src="http://www.baidu.com" width="200px" height="200px"></iframe>

 

</body>

 

<!-- css代码 -->

 

<style type="text/css">

 

<!--节点右键菜单的叶子图片-->

 

.leaf{

 

background-image:url(ExtJs/resources/images/default/tree/leaf.gif)  !important;

 

}

 

<!--节点右键菜单的文件夹图片-->

 

.folder{

 

background-image:url(ExtJs/resources/images/default/tree/folder.gif)  !important;

 

}

 

</style>

 

效果图:

图就不多贴出来,下面看核心代码:

核心代码:

 
 

Ext.onReady(function(){

 

    var mytree=new Ext.tree.TreePanel({

 

       id:"mytree",

 

       el:"container",

 

       animate:true,

 

       title:"可增删改的树tree",

 

       collapsible:true,

 

       frame:true,

 

       enableDD:true,

 

       enableDrag:true,

 

       rootVisible:true,

 

       autoScroll:true,

 

       autoHeight:true,

 

       width:250,

 

       lines:true,

 

       loader:new Ext.tree.TreeLoader({

 

           url:"CURDTree.ashx",//服务器处理数据代码

 

           listeners:{

 

              "loadexception":function(loader,node,response){

 

                  //加载服务器数据,直到成功

 

                  node.loaded = false;

 

                  node.reload.defer(10,node);

 

              }

 

           }

 

       }),

 

       listeners:{

 

           "contextmenu":function(node,e){

 

              if(node.isLeaf()){

 

                  var  nodemenu=new  Ext.menu.Menu({

 

                     items:[{

 

                         text:"添加小类别",

 

                         iconCls:'leaf',//右键名称前的小图片

 

                         handler:function(){

 

                            Ext.MessageBox.prompt("请输入新项名称","",function(e,text){

 

                                if(e=="ok"){

 

                                Ext.Ajax.request({

 

                                   url: 'CURDTree.ashx?newitemParentid='+node.parentNode.id.substring(2)+"&newitemValue="+text,

 

                                   success:function(request){

 

                                       mytree.root.reload();//数的重新加载

 

                                       mytree.root.expand(true,false);

 

                                   },

 

                                   failure:function(){

 

                                       alert("添加失败");

 

                                   }

 

                                });

 

                                } else {

 

                                   alert("取消了");

 

                                }

 

                            })

 

                         }

 

                     },{

 

                         text:"编辑小类别",

 

                         iconCls:'leaf',

 

                         handler:function(){

 

                            Ext.MessageBox.prompt("请输入此项新名称","",function(e,text){

 

                            if(e=="ok"){

 

                                Ext.Ajax.request({

 

                                url: 'CURDTree.ashx?editItemid='+node.id+"&editItemvalue="+text,//传递需要的值,服务器会执行修改

 

                                success:function(request){

 

                                       mytree.root.reload();

 

                                       mytree.root.expand(true,false);

 

                                },

 

                                failure:function(){

 

                                   alert("编辑失败");

 

                                }

 

                                });

 

                            } else {

 

                                alert("取消了");

 

                            }

 

                            })

 

                         }

 

                     },{

 

                     text:"删除小类别",

 

                     iconCls:'leaf',

 

                      handler:function(){

 

                         Ext.Ajax.request({

 

                            url: 'CURDTree.ashx?delItemid='+node.id,//根据id删除节点

 

                            success:function(request){

 

                                mytree.root.reload();

 

                                mytree.root.expand(true,false);

 

                            },

 

                            failure:function(){

 

                                alert("删除失败");

 

                            }

 

                         });

 

                     }

 

                     }]

 

                     });

 

                  nodemenu.showAt(e.getPoint());//menu的showAt,不要忘记

 

              }

 

              else  if(!node.isLeaf()&&node.parentNode!=null){

 

                  var  nodemenu=new Ext.menu.Menu({

 

                     items:[{

 

                         text:"添加大类别",

 

                         iconCls:'folder',

 

                         handler:function(){alert(node.id)}//在此略去

 

                     },{

 

                         text:"编辑大类别",

 

                         iconCls:'folder',

 

                         handler:function(){alert("执行事件代码")}

 

                     },{

 

                         text:"删除大类别",

 

                         iconCls:'folder',

 

                         handler:function(){alert("执行事件代码")}

 

                     }]

 

                  });

 

                  nodemenu.showAt(e.getPoint());

 

              }

 

           } 

 

       }

 

    });

 

    var root=new Ext.tree.AsyncTreeNode({

 

       id:"root",

 

       text:"管理菜单",

 

       expanded:true

 

    });

 

    mytree.setRootNode(root);

 

    mytree.render();

 

})

 

 

服务器端代码:

 
 

//CURDTree.ashx文件

 

//引用Newtonsoft.Json.dll

 

<%@ WebHandler Language="C#" Class="CURDTree" %>

 

 

 

using System;

 

using System.Web;

 

using System.IO;

 

using System.Linq;

 

using Newtonsoft.Json;

 

 

 

public class CURDTree : IHttpHandler {

 

    

 

public void ProcessRequest (HttpContext context) {

 

        LinqDataDataContext lddc = new LinqDataDataContext

 

(@"Data Source=WIN-7JW7UWR0M27\MSSQL2005;Initial Catalog=LinqData;

 

Persist Security Info=True;User ID=sa;Password=*****");

 

if (context.Request.QueryString["newitemParentid"] != null 

 

&& context.Request.QueryString["newitemValue"] != null) {

 

//添加

 

SmallClass sc = new SmallClass();

 

sc.BigClassId = Convert.ToInt32(context.Request.QueryString["newitemParentid"]);

 

sc.SmallClassName = Convert.ToString(context.Request.QueryString["newitemValue"]);

 

lddc.SmallClass.InsertOnSubmit(sc);

 

lddc.SubmitChanges();

 

} else if (context.Request.QueryString["editItemid"] != null&&context.Request.QueryString["editItemvalue"]!=null) {

 

//编辑

 

      SmallClass sc = lddc.SmallClass.First(s => s.id == Int32.Parse(context.Request.QueryString["editItemid"]));

 

      sc.SmallClassName = Convert.ToString(context.Request.QueryString["editItemvalue"]);

 

      lddc.SubmitChanges();

 

   } else if (context.Request.QueryString["delItemid"] != null) {

 

      //删除

 

      SmallClass sc = lddc.SmallClass.First(c => c.id == Int32.Parse(context.Request.QueryString["delitemid"]));

 

      lddc.SmallClass.DeleteOnSubmit(sc);

 

      lddc.SubmitChanges();

 

    } else {

 

      StringWriter sw = new StringWriter();

 

      JsonWriter writer = new JsonWriter(sw);

 

      var results = from small in lddc.SmallClass join big in lddc.BigClass on small.BigClassId equals big.id group small by small.BigClassId;

 

            //下面开始拼接json数据字符串

 

     writer.WriteStartArray();

 

//[,其他类似,请参见网上Newtonsoft.Json.dll的使用

 

     foreach (var r in results){

 

         writer.WriteStartObject();

 

         writer.WritePropertyName("id");

 

         writer.WriteValue("b_" + r.First().BigClass.id);

 

         writer.WritePropertyName("text");

 

         writer.WriteValue(r.First().BigClass.BigClassName);

 

         writer.WritePropertyName("children");

 

         writer.WriteStartArray();

 

         foreach (var s in r) {

 

             writer.WriteStartObject();

 

             writer.WritePropertyName("id");

 

             writer.WriteValue(s.id);

 

             writer.WritePropertyName("href");

 

             writer.WriteValue("FormSubmit.aspx?id=" + s.id);

 

             writer.WritePropertyName("hrefTarget");

 

                 writer.WriteValue("mainFrame");

 

                 writer.WritePropertyName("text");

 

                 writer.WriteValue(s.SmallClassName);

 

                 writer.WritePropertyName("leaf");

 

                 writer.WriteValue(true);

 

                 writer.WriteEndObject();

 

             }

 

             writer.WriteEndArray();

 

             writer.WriteEndObject();

 

         }

 

         writer.WriteEndArray();//]

 

         writer.Flush();

 

         string myjson = sw.ToString();

 

         context.Response.Write(myjson);//输出json数据结果

 

    }

 

}

 

public bool IsReusable {

 

    get {

 

        return false;

 

    }

 

}

 

}

 

 

 

ExtJs2.0学习系列(15)--extjs换肤

extjs的默认皮肤很好看,但是我们还可以变换样式切换其他皮肤.

1.  直接添加其他css文件换肤.

皮肤文件:xtheme-olive.zip下载

把皮肤文件解压,把css文件(如xtheme-olive.css)拷贝到extjs的resources目录下css文件夹里面:

解压皮肤文件,把里面的相应的 image文件夹下的目录(比如olive)拷贝到extjs的resources目录下images文件夹下

设置css文件如下:

其实就是在原有的基础上添加了个xtheme-olive.css文件.

效果图:

   

2.配合cookie实现网站换肤

我们的目标:

用户可以选择自己的样式,当下次用户打开的网站(在cookie的有效期内)的时候,自动读取cookie,显示先前选择的爱好的样式!

我们的原理:

//关键点

1.  document.getElementsByTagName("link")[1].href//获取或者设置第二个css文件的href值

2.  var date=new Date();//今天的日期

date.setTime(date.getTime()+30*24*3066*1000);//30天后的日期

document.cookie="css="+name+";expires="+date.toGMTString();//设置30天后过期的cookies(名称为css)

3.  var cookiesArr=document.cookie.split(";");

var css;

for(var i=0;i<cookiesArr.length;i++) {

var arr=cookiesArr[i].split("=");

if(arr[0]=="css") {

          css=arr[1];

          break;

       }

  }

//这段代码是获取cookies中想要的名称为css的cookies,并保存在变量css中去

4.  如果不设置expires的话,会在关闭浏览器后cookies失效.

html代码:

 
 

<!--切换标签-->

 

<a href="javascript:void(0)" οnclick="changecss('')">还原</a>

 

<a href="javascript:void(0)" οnclick="changecss('xtheme-olive.css')">绿色</a>

 

<a href="javascript:void(0)" οnclick="changecss('xtheme-gray.css')">灰色</a>

 

<a href="javascript:void(0)" οnclick="changecss('xtheme-purple.css')">purple</a>

 

关键js代码:

 
 

function changecss(name){

 

var date=new Date();

 

date.setTime(date.getTime()+30*24*3066*1000);

 

document.getElementsByTagName("link")[1].href="ExtJs/resources/css/"+name;

 

document.cookie="css="+name+";expires="+date.toGMTString();//设置cookies

 

}

 

var cookiesArr=document.cookie.split(";");

 

var css;

 

for(var i=0;i<cookiesArr.length;i++){

 

var arr=cookiesArr[i].split("=");

 

if(arr[0]=="css"){

 

css=arr[1];

 

break;

 

}

 

}

 

document.getElementsByTagName("link")[1].href="ExtJs/resources/css/"+css;//读取并应用css

 

效果图(下次打开浏览器还是这样):

OK,对于extjs的换肤,就聊到这里,其实觉得默认的皮肤还可以拉,

下面我提供几套丛网上下载到的皮肤,如果你有什么其他好看的皮肤,请跟帖答复,给个下载地址 .

http://files.cnblogs.com/qianxudetianxia/xtheme-slate.zip

http://files.cnblogs.com/qianxudetianxia/xtheme-purple.zip 

http://files.cnblogs.com/qianxudetianxia/xtheme-galdaka.zip 

http://files.cnblogs.com/qianxudetianxia/xtheme-darkgray.zip 

http://files.cnblogs.com/qianxudetianxia/xtheme-black.zip 

thanks!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值