Extjs学习笔记(-):ComboBox联动

看到Extjs Example那些美轮美奂的界面,我也不禁心动了,也加入到学习Extjs的行列中来了,到园子里找了些朋友们的相关文档,囫囵吞枣的大都看了一遍,好像都还能理解,不过,经验告诉我,能看懂与能自己写,那根本就是两回事,况且这次还是大部分的手写javascript代码呀,所以还是不能光说不练,现在就动手:
我准备用ExtJS实现两个comeboBox(DropDownList)联动的效果,代码如下:
服务端代码:CategoryManage.aspx
GetCatWise.aspx
 1 using System;
 2 using System.Data;
 3 using System.Configuration;
 4 using System.Collections;
 5 using System.Web;
 6 using System.Web.Security;
 7 using System.Web.UI;
 8 using System.Web.UI.WebControls;
 9 using System.Web.UI.WebControls.WebParts;
10 using System.Web.UI.HtmlControls;
11 using RainbowSoft.BLL;
12 using RainbowSoft.Module;
13 using Newtonsoft.Json;
14 
15 public partial class Admin_GetCatWise : System.Web.UI.Page
16 {
17     protected void Page_Load(object sender, EventArgs e)
18     {
19         Response.Write(GetCatWise());
20     }
21 
22     private string GetCatWise()
23     {
24         CategoryWiseBLL cbl = CategoryWiseBLL.Instance;
25         return JavaScriptConvert.SerializeObject(cbl.GetCatWise());
26     }
27 }
还有一个通过传入的分类方式ID获取类别列表的页面,代码和上面的大同小异,我就不贴出来了,需要特别说明的就是,客户端需要返回的数据格式为JSON格式,JavaScriptConvert.SerializeObject(cbl.GetCatWise()),这句代码就是把服务器端返回的list对象序列化成JSON格式,返回的数据如下:
[{ " ID " : " 91ad6568-9b13-42b3-8004-4140dae534ed " , " Name " : " 按印花工艺分类 " , " Type " : null , " PubTime " : new  Date( 1195331771000 )},{ " ID " : " 9e5c6fa7-873e-4a6b-8f99-76f9c80bf1b4 " , " Name " : " 按印花工艺分类 " , " Type " : null , " PubTime " : new  Date( 1195335234000 )},{ " ID " : " 1185849f-f032-4e0f-9247-84acb9a766be " , " Name " : " 按印花工艺分类2 " , " Type " : " asdfasdf " , " PubTime " : new  Date( 1196121239000 )},{ " ID " : " 724f4feb-faf8-47cb-a5ce-89e72530a74e " , " Name " : " 按印花工艺分类2 " , " Type " : null , " PubTime " : new  Date( 1195335316000 )},{ " ID " : " ec22aa35-d5c7-4089-bf35-8bf5f6787c06 " , " Name " : " 按印花工艺分类 " , " Type " : null , " PubTime " : new  Date( 1195333503000 )},{ " ID " : " 36814f7c-8c44-49e9-82e9-c5bc8d1be3e7 " , " Name " : " 按印花工艺分类2 " , " Type " : null , " PubTime " : new  Date( 1196118357000 )}]

接下来就是核心的js代码了:
  1  //  JScript 文件
  2  Ext.onReady( function (){
  3       var  win;
  4       var  btnAdd = Ext.get( ' btnAdd ' );
  5      
  6       // 分类方式数据源
  7       var  store = new  Ext.data.Store({
  8          proxy: new  Ext.data.HttpProxy({
  9              url: ' ../admin/GetCatWise.aspx '
 10          }),
 11          reader: new  Ext.data.JsonReader({
 12              id: ' ID ' ,
 13              fields:[ ' ID ' , ' Name ' ]
 14          }),
 15          remoteSort: true
 16      });
 17    
 32       // grid 数据源
 33       var  gridstore = new  Ext.data.GroupingStore({
 34          proxy: new  Ext.data.HttpProxy({
 35              url: ' ../admin/categorymanage.aspx '
 36          }),
 37          reader: new  Ext.data.JsonReader({
 38              id: ' ID ' ,
 39              fields:[ ' ID ' , ' CategoryName ' , ' Code ' ,{name: ' PicCount ' ,type: ' int ' },{name: ' CCount ' ,type: ' int ' },{name: ' IsDefault ' ,type: ' string ' },{name: ' Name ' ,type: ' string ' ,mapping: ' CatWise.Name ' }]
 40          }),
 41          remoteSort: true ,
 42          groupField: ' Name '
 43      });
 44      gridstore.setDefaultSort( ' PubTime ' ' desc ' );

 49       function  readerDefault(value,p,r){
 50           return  r.data.IsDefault ?   ' ' : ' ' ;
 51      }
 52      
 53       var  nm  =   new  Ext.grid.RowNumberer();
 54       var  sm  =   new  Ext.grid.CheckboxSelectionModel();
 55       var  cm  =   new  Ext.grid.ColumnModel([nm,sm,{
 56             id:  ' ID ' //  id assigned so we can apply custom css (e.g. .x-grid-col-topic b { color:#333 })
 57             header:  " 类别编号 " ,
 58             dataIndex:  ' Code ' ,
 59             width:  10
 61          },{
 62             header:  " 类别名称 " ,
 63             dataIndex:  ' CategoryName ' ,
 64             width:  100 ,
 65             hidden:  false
 66          },{
 67             header:  " 图片数 " ,
 68             dataIndex:  ' PicCount ' ,
 69             width:  70 ,
 70             align:  ' right '
 71          },{
 72             header:  " 子类数 " ,
 73             dataIndex:  ' CCount ' ,
 74             width:  70 ,
 75             align:  ' right '
 76          },{
 77             header:  " 分类方式 " ,
 78             dataIndex:  ' Name ' ,
 79             width:  140 ,
 80             align:  ' center '
 81          },{
 82              header: " 是否默认 " ,
 83              dataIndex: ' IsDefault ' ,
 84              width: 70 ,
 85              align: ' center ' ,
 86              renderer:readerDefault
 87          }]);
 88 
 89       //  by default columns are sortable
 90      cm.defaultSortable  =   true ;
 91      
 92      
 93       var  grid = new  Ext.grid.GridPanel({
 94          el: ' topic-grid ' ,
 95          width: 600 ,
 96          height: 400 ,
 97          title: ' 类别管理 ' ,
 98          store:gridstore,
 99          cm:cm,
100          sm:sm,
101          iconCls:  ' icon-grid ' ,
102          collapsible:  true ,
103          animCollapse:  false ,
104           // trackMouseOver:false,
105           // sm: new Ext.grid.RowSelectionModel({selectRow:Ext.emptyFn}),
106          loadMask:  true ,
107          stripeRows:  true ,
108          autoExpandColumn:  ' ID ' ,
109          viewConfig: {
110              forceFit: true ,
111               // enableRowBody:true,
112              showPreview: true ,
113              getRowClass :  function (record, rowIndex, p, store){
114                   if ( this .showPreview){
115                      p.body  =   ' <p> ' + record.data.ID + ' </p> ' ;
116                       return   ' x-grid3-row-expanded ' ;
117                  }
118                   return   ' x-grid3-row-collapsed ' ;
119              }
120          },
121          
122          view:  new  Ext.grid.GroupingView({
123              groupTextTpl:  ' {text} ({[values.rs.length]} {[values.rs.length > 1 ? "Items" : "Item"]}) '
124          }),
125          
126          tbar:[{
127              id: ' btnAdd ' ,
128              text: ' 新增 ' ,
129              tooltip: ' 新增 ' ,
130              iconCls: ' add ' ,
131              handler: showAddPanel
132          },  ' - ' , {
133              text: ' 查询 ' ,
134              tooltip: ' 查询 ' ,
135              iconCls: ' search '
136          },  ' - ' , {
137              text: ' 批量删除 ' ,
138              tooltip: ' 删除 ' ,
139              iconCls: ' remove '
141         }]
142      });
143      
144      grid.render();
145      gridstore.load();
146      grid.getSelectionModel().selectFirstRow();
147      
148       var  form = new  Ext.form.FormPanel({
149          labelWidth: 55 ,
150          url: ' save-form.php ' ,
151          bodyStyle: ' padding:5px 5px 0 ' ,
152          frame: true ,
153          items:[{
154              layout: ' column ' ,
155              items:[{
156                  columnWidth:. 78 ,
157                  layout: ' form ' ,
158                  items:[{
159                      fieldLabel: ' 类别编号 ' ,
160                      xtype: ' textfield ' ,
161                      name: ' txtCode ' ,
162                      id: ' txtCode ' ,
163                      anchor: ' 98% '
164                       // disabled:true
165                  }]
166              },{
167                  columnWidth:. 22 ,
168                  layout: ' form ' ,
169                  items:[{
170                      hideLabel:  true ,
171                      boxLabel : ' 自动生成编号 ' ,
172                      xtype: ' checkbox ' ,
173                      name: ' labCode ' ,
174                      id: ' labCode ' ,
175                      anchor: ' 100% ' ,
176                      checked: true ,
177                      listeners:{check: function (){
178                           var  txtCode = Ext.getCmp( ' txtCode ' );
179                           if ( this .checked){
180                              txtCode.disable();
181                          } else {
182                              txtCode.enable();
183                          }
184                      }}
185                  }]
186              }]
187          },{
188              fieldLabel: ' 类别名称 ' ,
189              xtype: ' textfield ' ,
190              name: ' labName ' ,
191              anchor: ' 100% '
192          },{
193              fieldLabel: ' 分类方式 ' ,
194              xtype: ' combo ' ,
195              editable : false ,
196              name: ' labCatWise ' ,
197              id: ' cmbCatWise ' ,
198              emptyText : ' 请选择 ' ,
199              displayField: ' Name ' ,
200              valueField : ' ID ' ,
201              mode: ' remote ' ,
202              store:store,
203              listeners:{select: function (){
204                  var parent=Ext.getCmp('comParent');
205                 var store =new Ext.data.Store({
206                     baseParams:{wiseID:this.value},
207                     proxy:new Ext.data.HttpProxy({
208                         url:'../admin/GetCategory.aspx',
209                         method:'post'
210                     }),
211                     reader:new Ext.data.JsonReader({
212                         id:'ID',
213                         fields:['ID','CategoryName']
214                     }),
215                     remote:true
216                 });
217                 parent.store=store; 
218                 parent.displayField='CategoryName';
219                 parent.valueField ='ID'

220                  
221                  
222  //                     var conn=new Ext.data.Connection();
223  //                     conn.request({
224  //                         url:'../admin/GetCategory.aspx',
225  //                         method:'post',
226  //                         params:{wiseID:this.value},
227  //                         scope: this ,
228  //                         callback:function(options,success, response){ 
229  //                             if(success){   
230  //                                 var cat = Ext.util.JSON.decode(response.responseText);   
231  //                                 //Ext.MessageBox.alert(cat[0].CategoryName);
232  //                                 //catstore.data=cat;
233  //                                 var parent=Ext.getCmp('comParent');
234  //                                 parent.store=new Ext.data.Store({
235  //                                     data:response.responseText,
236  //                                     reader:new Ext.data.JsonReader({
237  //                                         id:'ID',
238  //                                         fields:['ID','CategoryName']
239  //                                     })
240  //                                 }); 
241  //                                 parent.displayField='CategoryName';
242  //                                 parent.valueField ='ID';   
243  //                             }    
244  //                             else     
245  //                                 {Ext.MessageBox.alert("提示","所选记录删除失败!");}     
246  //                         }  
247  //                     });
248              }},
249              triggerAction: ' all ' ,
250              typeAhead : true ,
251              anchor: ' 100% '
252              
253          }, {
254              fieldLabel: ' 所属父类 ' ,
255              xtype: ' combo ' ,
256              editable : false ,
257              emptyText : ' 请选择 ' ,
258              id: ' comParent ' ,
259              loadingText : ' 正在请求数据,请稍后 ' ,
260              triggerAction: ' all ' ,
261              name: ' labParent ' ,
262              anchor: ' 100% '
263          },{
264              xtype:  ' textarea ' ,
265              hideLabel:  true ,
266              name:  ' msg ' ,
267              anchor:  ' 100% -110 '    //  anchor width by percentage and height by raw adjustment
268          }]
269      });
270 
271      
272       function  showAddPanel(){
273           if ( ! win)
274          {
275              win = new  Ext.Window({
276                  el: ' hello-win ' ,
277                  width: 500 ,
278                  height: 300 ,
279                  minWidth:  300 ,
280                  minHeight:  200 ,
281                  layout: ' fit ' ,
282                  closeAction: ' hide ' ,
283                  plain: true ,
284                  bodyStyle: ' padding:5px; ' ,
285                  buttonAlign: ' center ' ,
286                  title: ' 添加类别 ' ,
287                  items:form,
288                  
289                  buttons:[{
290                      text: ' 提交 ' ,
291                      handler: function (){
292                          Ext.MessageBox.alert( ' Warning! ' ' Incorrect Login ' );
293                      }
294                  },{
295                      text: ' 取消 ' ,
296                      handler: function (){
297                          win.hide();
298                      }
299                  }]
300              });
301          }
302          win.show( this );
303      }
304  });
305 
306 
在以上代码中,我在第一个comboBox中添加了一个select事件,在这个事件中,我先获取到第二个comboBox,然后给他添加一个Store,不过,以上代码在页面第一次加载的时候运行成功,当我再次选择第一个comboBox时,第二个comboBox不会有数据被加载,不知道什么原因,还请各位大虾指教.
对了,代码环境是vs2005

你可能感兴趣的:(Extjs学习笔记(-):ComboBox联动)