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);
//
选中拖动过来的列
}
});
});