Ext-GridPanel 拖拽排序的实现方案

时间: 2011-07-18 / 分类: JavaScript / 浏览次数: 628 views / 0个评论 发表评论

前两天在项目中需要实现拖拽排序,研究了一段时间,搞定了,写出来做个备忘。

参考了以为网友提供的方法。就是排序值的设计。

image

说下理论:当拖到最前面,排序值就是第一个的值-1,拖到最后一个就是最后一个的排序值加1,拖到中间就是,上下两个排序值的平均值。

下面是实现的部分代码:

   1:  var cm = new Ext.grid.ColumnModel( [ new Ext.grid.RowNumberer(), sm, {
   2:          header : '答案值',
   3:          dataIndex : 'answer',
   4:          width : 100
   5:      }, {
   6:          header : '答案分值',
   7:          dataIndex : 'answerScore',
   8:          width : 100
   9:      }, {
  10:          header : '答案排序值',
  11:          dataIndex : 'answerIndex',
  12:          width : 100
  13:      } , {
  14:          header : '答案描述',
  15:          dataIndex : 'description',
  16:          width : 100
  17:      }]);
  18:      var ds_da = new Ext.data.Store( {
  19:          proxy : new Ext.data.HttpProxy( {
  20:              url : 'admin/getFactorAnsListByFactor.action?factorid='+fdid
  21:          }),
  22:          reader : new Ext.data.JsonReader( {
  23:  
  24:              root : ''
  25:          }, [ {
  26:              name : 'answer'
  27:          }, {
  28:              name : 'answerScore'
  29:          }, {
  30:              name : 'answerIndex',
  31:              type:'float'
  32:          }, {
  33:              name : 'description'
  34:          } ,{
  35:              name : 'id'
  36:          }])
  37:      });
  38:      var answerPanel=new Ext.grid.GridPanel({
  39:          title:"答案列表",
  40:          ds : ds_da,
  41:          cm : cm,
  42:          sm : sm,
  43:          height : 200,
  44:          autoSizeColumns : true,
  45:          loadMask : true,
  46:          dropConfig: {appendOnly:false},
  47:          trackMouseOver : true,
  48:          enableDragDrop: true,
  49:          //ddGroup: "GridDD",
  50:          tbar:toolbar
  51:      });

以上是Grid

   1:  var ddrow = new Ext.dd.DropTarget(answerPanel.container, {
   2:          ddGroup : 'GridDD',
   3:          copy    : false,
   4:          notifyDrop : function(dd, e, data) {
   5:              // 选中了多少行
   6:              debugger
   7:              var rows = data.selections;
   8:              // 拖动到第几行
   9:              var index = dd.getDragData(e).rowIndex;
  10:              if (typeof(index) == "undefined") {
  11:                  return;
  12:              }
  13:              // 修改store
  14:              for(i = 0; i < rows.length; i++) {
  15:                  var rowData = rows[i];
  16:                  if(!this.copy) ds_da.remove(rowData);
  17:  
  18:                  if(index== 0)
  19:                  {
  20:                  rowData.data.answerIndex -=1 ;
  21:                  }
  22:                  else if(index == ds_da.data.items.length)
  23:                  {
  24:                  rowData.data.answerIndex = ds_da.data.items[index-1].data.answerIndex+1;
  25:                  }
  26:                  else
  27:                  {
  28:                  rowData.data.answerIndex = (ds_da.data.items[index-1].data.answerIndex + ds_da.data.items[index].data.answerIndex)/2
  29:                  }
  30:                  ds_da.insert(index, rowData);
  31:                  updateRow(rowData,fdid);
  32:              }
  33:          }
  34:      });

以上是拖拽目标事件和算法。

特别注意的是:拖拽的这个目标方法,一定要写在那个GridPanel 已经显示出来的情况下。不然会报错。这里我卡了很长一段时间没有找到原因。

发表评论

您的昵称 *

您的邮箱 *

您的网站