0

数日前から、ExtJs [「グリッドからツリーへのドラッグ アンド ドロップ」の例][1] を両方向で動作するように変更しようとしています。しかし、私が得たのは「ほぼ」機能するアプリケーションだけです。

アイテムをグリッドからツリー、ツリー内、グリッド内にドラッグできる限り機能しますが、ツリーからグリッドにドラッグしてもドロップしません。緑のフックが表示されているだけです。

また、ddGroup をツリーやグリッドと区別しようとしましたが、何も機能しなくなりました。これは、ExtJs の初心者には多すぎます。

// Stücklisten Grid
stuecklistengrid = Ext.extend(Ext.grid.GridPanel, {
initComponent:function() {
var config = {
store:itemPartStore
,columns:[{
id:'PART_ITE_ID'
,header:"PART_ITE_ID"
,width:200, sortable:true
,dataIndex:'PART_ITE_ID'
},{
header:"IS_EDITABLE"
,width:100
,sortable:true
,dataIndex:'IS_EDITABLE'
},{
header:"IS_VISIBLE"
,width:100
,sortable:true
,dataIndex:'IS_VISIBLE'
}]
,viewConfig:{forceFit:true}
}; // eo config object

// apply config
Ext.apply(this, Ext.apply(this.initialConfig, config));

this.bbar = new Ext.PagingToolbar({
store:this.store
,displayInfo:true
,pageSize:10
});
// call parent
stuecklistengrid.superclass.initComponent.apply(this, arguments);
} // eo function initComponent

,onRender:function() {
// call parent
stuecklistengrid.superclass.onRender.apply(this, arguments);

// load the store
this.store.load({params:{start:0, limit:10}});

} // eo function onRender

});
Ext.reg('examplegrid', stuecklistengrid);


// Stücklisten Tree
var CheckTree = new Ext.tree.TreePanel({
    root:{    text:'root', id:'root', expanded:true, children:[{
            text:'Folder 1'
            ,qtip:'Rows dropped here will be appended to the folder'
            ,children:[{
            text:'Subleaf 1'
            ,qtip:'Subleaf 1 Quick Tip'
            ,leaf:true
            }]
            },{
            text:'Folder 2'
            ,qtip:'Rows dropped here will be appended to the folder'
            ,children:[{
            text:'Subleaf 2'
            ,qtip:'Subleaf 2 Quick Tip'
            ,leaf:true
            }]
            },{
            text:'Leaf 1'
            ,qtip:'Leaf 1 Quick Tip'
            ,leaf:true
            }]},
    loader:new Ext.tree.TreeLoader({preloadChildren:true}),
    enableDD:true,
    ddGroup:'grid2tree',
    id:'tree',
    region:'east',
    title:'Tree',
    layout:'fit',
    width:300,
    split:true,
    collapsible:true,
    autoScroll:true,
    listeners:{
    // create nodes based on data from grid
    beforenodedrop:{fn:function(e) {
    // e.data.selections is the array of selected records
    if(Ext.isArray(e.data.selections)) {

    // reset cancel flag
    e.cancel = false;

    // setup dropNode (it can be array of nodes)
    e.dropNode = [];
    var r;
    for(var i = 0; i < e.data.selections.length; i++) {

    // get record from selectons
    r = e.data.selections[i];

    // create node from record data
    e.dropNode.push(this.loader.createNode({
    text:r.get('PART_ITE_ID')
    ,leaf:true
    ,IS_EDITABLE:r.get('IS_EDITABLE')
    ,IS_VISIBLE:r.get('IS_VISIBLE')
    }));
    }

    // we want Ext to complete the drop, thus return true
    return true;
    }

    // if we get here the drop is automatically cancelled by Ext
    }}
    }
});

// Stücklisten Container
var itemPartList = new Ext.Container({
    id: 'itemPartList',
    title: 'Stücklisten',
    border:false,
    layout:'border',
    items:[CheckTree, {
    xtype:'examplegrid'
    ,id:'SLgrid'
    ,title:'Grid'
    ,region:'center'
    ,layout:'fit'
    ,enableDragDrop:true
    ,ddGroup:'grid2tree'
    ,listeners: {
        afterrender: {
            fn: function() {
                // This will make sure we only drop to the view scroller element
                SLGridDropTargetEl2 = Ext.getCmp('SLgrid').getView().scroller.dom;
                SLGridDropTarget2 = new Ext.dd.DropTarget(SLGridDropTargetEl2, {
                        ddGroup    : 'grid2tree',
                        notifyDrop : function(ddSource, e, data){
                                var records =  ddSource.dragData.selections;
                                Ext.each(records, ddSource.grid.store.remove,  
ddSource.grid.store);
                                Ext.getCmp('SLgrid').store.add(records);
                                return true
                        }
                });
            }
        }
    }
    }]
    });
4

1 に答える 1

0

グリッドの onNodeDrop イベントを実装する必要があります。http://docs.sencha.com/ext-js/4-1/#!/api/Ext.grid.header.DropZone-method-onNodeDropを参照してください。

于 2012-10-24T09:05:45.690 に答える