Ext 实现grid之间的拖放(D&D between 2 grids)

Ext 提供了丰富的界面效果,其一便是拖动。我试着实现两个grid间的拖动。效果不错。

原理很简单,就是两个gird都设置支持拖拽的属性: enableDragDrop: true,   dropConfig: { appendOnly:true },  ddGroup: "GridDD2"

然后 new Ext.dd.DropTarget ,在其notifyDrop里面写拖动的处理函数。

话不多说,上代码!

HTML:

 

<html>
<head>
<title>dd 2 grids</title>

        
<link rel="stylesheet" type="text/css" href="ext-2.0.2/resources/css/ext-all.css" /> 
        
<script type="text/javascript" src="ext-2.0.2/adapter/ext/ext-base.js"></script> 
        
<script type="text/javascript" src="ext-2.0.2/ext-all-debug.js"></script>
        
<script type="text/javascript" src="mydd2grids.js"></script>
</head>
<body>
<div id="grid1-example"></div>
<div id="grid2-example"></div>
</body>
</html>

 

JAVASCRIPT(mydd2grids.js):

 

 

/*
 *  by Patrickchen 2008
 
*/

Ext.onReady(
function(){

    Ext.state.Manager.setProvider(
new Ext.state.CookieProvider());

    
var myData = [
        [
'3m Co',71.72,0.02,0.03,'9/1 12:00am'],
        [
'Alcoa Inc',29.01,0.42,1.47,'9/1 12:00am'],
        [
'Altria Group Inc',83.81,0.28,0.34,'9/1 12:00am'],
        [
'American Express Company',52.55,0.01,0.02,'9/1 12:00am'],
        [
'American International Group, Inc.',64.13,0.31,0.49,'9/1 12:00am'],
        [
'AT&T Inc.',31.61,-0.48,-1.54,'9/1 12:00am'],
        [
'Boeing Co.',75.43,0.53,0.71,'9/1 12:00am'],
        [
'Caterpillar Inc.',67.27,0.92,1.39,'9/1 12:00am'],
        [
'Citigroup, Inc.',49.37,0.02,0.04,'9/1 12:00am'],
        [
'E.I. du Pont de Nemours and Company',40.48,0.51,1.28,'9/1 12:00am'],
        [
'Exxon Mobil Corp',68.1,-0.43,-0.64,'9/1 12:00am'],
        [
'General Electric Company',34.14,-0.08,-0.23,'9/1 12:00am'],
        [
'General Motors Corporation',30.27,1.09,3.74,'9/1 12:00am'],
        [
'Hewlett-Packard Co.',36.53,-0.03,-0.08,'9/1 12:00am'],
        [
'Honeywell Intl Inc',38.77,0.05,0.13,'9/1 12:00am'],
        [
'Intel Corporation',19.88,0.31,1.58,'9/1 12:00am'],
        [
'International Business Machines',81.41,0.44,0.54,'9/1 12:00am'],
        [
'Johnson & Johnson',64.72,0.06,0.09,'9/1 12:00am']
    ];

    
// example of custom renderer function
    function change(val){
        
if(val > 0){
            
return '<span style="color:green;">' + val + '</span>';
        }
else if(val < 0){
            
return '<span style="color:red;">' + val + '</span>';
        }
        
return val;
    }

    
// example of custom renderer function
    function pctChange(val){
        
if(val > 0){
            
return '<span style="color:green;">' + val + '%</span>';
        }
else if(val < 0){
            
return '<span style="color:red;">' + val + '%</span>';
        }
        
return val;
    }

    
// create the data store
    var store = new Ext.data.SimpleStore({
        fields: [
           {name: 
'company'},
           {name: 
'price', type: 'float'},
           {name: 
'change', type: 'float'},
           {name: 
'pctChange', type: 'float'},
           {name: 
'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
        ]
    });
    store.loadData(myData);

    
// create the Grid
    var grid1 = new Ext.grid.GridPanel({
        store: store,
        columns: [
            {id:
'company',header: "Company", width: 160, sortable: true, dataIndex: 'company'},
            {header: 
"Price", width: 75, sortable: true, renderer: 'usMoney', dataIndex: 'price'},
            {header: 
"Change", width: 75, sortable: true, renderer: change, dataIndex: 'change'},
            {header: 
"% Change", width: 75, sortable: true, renderer: pctChange, dataIndex: 'pctChange'},
            {header: 
"Last Updated", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'}
        ],
        stripeRows: 
true,
        autoExpandColumn: 
'company',
        height:
350,
        width:
600,
        title:
'Array Grid1',
        
//most important as follow
        enableDragDrop: true,
        dropConfig: {
            appendOnly:
true
        },
        ddGroup: 
"GridDD"
    });

    grid1.render(
'grid1-example');
    
    
//grid2 -----
     var myData2 = [
        [
'JP Morgan & Chase & Co',45.73,0.07,0.15,'9/1 12:00am'],
        [
'McDonald\'s Corporation',36.76,0.86,2.40,'9/1 12:00am'],
        ['Merck & Co., Inc.',40.96,0.41,1.01,'9/1 12:00am'],
        [
'Microsoft Corporation',25.84,0.14,0.54,'9/1 12:00am'],
        [
'Pfizer Inc',27.96,0.4,1.45,'9/1 12:00am'],
        [
'The Coca-Cola Company',45.07,0.26,0.58,'9/1 12:00am'],
        [
'The Home Depot, Inc.',34.64,0.35,1.02,'9/1 12:00am'],
        [
'The Procter & Gamble Company',61.91,0.01,0.02,'9/1 12:00am'],
        [
'United Technologies Corporation',63.26,0.55,0.88,'9/1 12:00am'],
        [
'Verizon Communications',35.57,0.39,1.11,'9/1 12:00am'],
        [
'Wal-Mart Stores, Inc.',45.45,0.73,1.63,'9/1 12:00am']
    ];
     
var store2 = new Ext.data.SimpleStore({
        fields: [
           {name: 
'company'},
           {name: 
'price', type: 'float'},
           {name: 
'change', type: 'float'},
           {name: 
'pctChange', type: 'float'},
           {name: 
'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
        ]
    });
    store2.loadData(myData2);
    
     
var grid2 = new Ext.grid.GridPanel({
        store: store2,
        columns: [
            {id:
'company',header: "Company", width: 160, sortable: true, dataIndex: 'company'},
            {header: 
"Price", width: 75, sortable: true, renderer: 'usMoney', dataIndex: 'price'},
            {header: 
"Change", width: 75, sortable: true, renderer: change, dataIndex: 'change'},
            {header: 
"% Change", width: 75, sortable: true, renderer: pctChange, dataIndex: 'pctChange'},
            {header: 
"Last Updated", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'}
        ],
        stripeRows: 
true,
        autoExpandColumn: 
'company',
        height:
350,
        width:
600,
        title:
'Array Grid2',
        
//most important as follow
        enableDragDrop: true,
        dropConfig: {
            appendOnly:
true
        },
        ddGroup: 
"GridDD2"
    });

    grid2.render(
'grid2-example');
    
    
//grid1->grid2
    //this is a grid DragDrop
    var ddrow = new Ext.dd.DropTarget(grid2.getEl(), {
        ddGroup: 
"GridDD",  // Data come from
        // copy:true,
        notifyDrop : function(dd, e, data){
            
var rows=grid1.getSelectionModel().getSelections();
            
var count = rows.length;
            
var cindex=dd.getDragData(e).rowIndex;
            
var array=[];
            
for(var i=0;i<count;i++){
                
var index = cindex+i;
                array.push(index);
            }
            
            store2.insert(cindex,data.selections); 
//在grid2中新增拖动列
            grid2.getView().refresh(); 
            grid2.getSelectionModel().selectRows(array); 
//选中拖动过来的列
        }
    });
});

 

 

posted @ 2008-10-29 13:21  MichaelChen  阅读(3787)  评论(4编辑  收藏  举报