将行拖放到列

时间:2012-07-30 10:11:27

标签: extjs

我是Ext JS的新手,我尝试过'拖放',拖动行时效果很好。我现在正在尝试从左侧网格拖动一行(来自MySQL的字段)并将其放在右侧网格上,从而将数据库表中的数据作为列。

我现在使用的代码是,

Ext.require([
        'Ext.grid.*',
        'Ext.data.*',
        'Ext.dd.*'
    ]);

    Ext.define('DataObject', {
        extend: 'Ext.data.Model',
        fields: ['Field']
    });

    Ext.onReady(function(){

            var firstGridStore = Ext.create('Ext.data.Store', {
            model: 'DataObject',

                autoLoad: true,
                pageSize: 4,
                proxy: {
                    type: 'ajax',
                    url : 'user.php',
                    reader: {
                    type: 'json',
                    root: 'users'            
                }
            }
        });

        // Column Model shortcut array
        var columns = [
            {text: "Fields", sortable: true, width: 50, dataIndex: 'Field'}
        ];

        var firstGrid = Ext.create('Ext.grid.Panel', {
            multiSelect: true,
            viewConfig: {
                plugins: {
                    ptype: 'gridviewdragdrop',
                    dragGroup: 'firstGridDDGroup',
                    dropGroup: 'secondGridDDGroup'
                },
                listeners: {
                    drop: function(node, data, dropRec, dropPosition) {
                        var dropOn = dropRec ? ' ' + dropPosition + ' ' + dropRec.get('name') : ' on empty view';
                        Ext.example.msg("Drag from right to left", 'Dropped ' + data.records[0].get('name') + dropOn);
                    }
                }
            },
            store            : firstGridStore,
            columns          : columns,
            stripeRows       : true,
            title            : 'First Grid',
            margins          : '0 2 0 0'
        });

        var secondGridStore = Ext.create('Ext.data.Store', {
            model: 'DataObject'
        });

        // create the destination Grid
        var secondGrid = Ext.create('Ext.grid.Panel', {
            viewConfig: {
                plugins: {
                    ptype: 'gridviewdragdrop',
                    dragGroup: 'secondGridDDGroup',
                    dropGroup: 'firstGridDDGroup'
                },
                listeners: {
                    drop: function(node, data, dropRec, dropPosition) {
                        var dropOn = dropRec ? ' ' + dropPosition + ' ' + dropRec.get('name') : ' on empty view';
                        Ext.example.msg("Drag from left to right", 'Dropped ' + data.records[0].get('name') + dropOn);
                    }
                }
            },
            store            : secondGridStore,
            columns            : columns,
            stripeRows       : true,
            title                   : 'Second Grid',
            margins             : '0 0 0 3'
        });

        //Simple 'border layout' panel to house both grids
        var displayPanel = Ext.create('Ext.Panel', {
            layout: 'fit',
            height       : 300,
            layout       : {
                type: 'hbox',
                align: 'stretch',
                padding: 5
            },
            renderTo     : 'panel',
            defaults     : { flex : 1 }, //auto stretch
            items        : [
                firstGrid,
                secondGrid
            ],
            dockedItems: {
                xtype: 'toolbar',
                dock: 'bottom',
                items: ['->', // Fill
                {
                    text: 'Reset both grids',
                    handler: function(){
                        //refresh source grid
                        firstGridStore.loadData(myData);

                        //purge destination grid
                        secondGridStore.removeAll();
                    }
                }]
            }
        });
    });

左边网格中的字段应该是右边网格上数据的标题(来自数据库),符合我的要求。

左侧网格将具有如下网格数据:
字段
ID
命名
数据
从左侧网格拖动数据后,右侧网格应具有如下数据:
ID
1
2
3
注意:此处仅拖动id。

有人能帮助我吗?

感谢。

2 个答案:

答案 0 :(得分:2)

你可以使用“beforedrop”而不是“drop”事件,但是你可以通过为dropFunction属性分配一个新函数来设置你自己的自定义drop处理程序,希望这可以帮助你解决问题! ! 另见http://docs.sencha.com/ext-js/4-1/#!/api/Ext.grid.plugin.DragDrop

答案 1 :(得分:0)

要记住几件事情。

  1. 你的模型驱动布局 - 你要定义一个字段'Field'的'DataObject',由users.php json调用/ return填充,如果你想要json-return中的所有字段要是可拖动的,那么你需要在模型中包含所有字段,即

    Ext.define('DataObject', {
        extend: 'Ext.data.Model',
        fields: [
           'id',
           'name',
           'data'
        ]
    });
    
  2. 字段名称必须匹配源和目标之间的拖放 - 只要你想要的拖拽字段具有相同的名称(dataField定义),那么你的拖拽代理将拉出你想要的所有项目。

    < / LI>
  3. 当然,如果您只想显示标题,那么您的显示将是:

    items: [
       { dataIndex: 'id', hidden: true } ,
       { dataIndex: 'name', hidden: true },
       { text: 'title', dataIndex: 'data', width: xx }   // loose example
    ]
    
  4. dragdrop代理将拉出网格/表单行中的所有内容,无论是显示还是隐藏..

    希望这有帮助