Поиск идентификатора строки в панели сетки

#extjs4

#extjs4

Вопрос:

Как мне найти индекс строки в gridpanel, который содержит списки со списком в одном из столбцов и используется для обновления хранилища / базы данных через прокси-сервер ajax? Я использую Ext.grid.plugin.CellEditing . Вот мой код. Спасибо, что посмотрели на это!

 Ext.Loader.setConfig({
    enabled: true 
});
Ext.Loader.setPath('Ext.ux', '/extjs4/examples/ux');
Ext.require([
    'Ext.layout.container.Fit',
    'Ext.grid.*',
    'Ext.data.*',
    'Ext.util.*',
    'Ext.panel.*',
    'Ext.selection.CellModel',
    'Ext.state.*',
    'Ext.form.*',
    'Ext.ux.CheckColumn'
]);
Ext.define('Ext.app.HirePlanGrid', {
    extend: 'Ext.panel.Panel',
    alias: 'widget.hirePlangrid'   
    ,hireplanstoreId: 'hireplanstore'
,hiremonthstoreId: 'hiremonthstore'
    ,renderMonth : function (value, p, record) {
        var fkStore = Ext.getStore(this.up('hirePlangrid').hiremonthstoreId);
        var rec = fkStore.findRecord("MONTH_ID", value);
        //return rec.get("ABBREVIATED_MONTH");
    }
    ,initComponent: function() { 
        this.editing = Ext.create('Ext.grid.plugin.CellEditing', {
            clicksToEdit: 2
        });

        var objMonthStore = Ext.getStore(this.hiremonthstoreId);
        objMonthStore.load();

        var objStore = Ext.getStore(this.hireplanstoreId);
        objStore.setProxy( {
            type: 'ajax', 
            url: 'hireplan.cfc?method=getEmployees'
        });

        objStore.load();
        var onDeleteClick = function(field, value, options) {       
            // var objPanel = this.down('gridpanel');
            var selection = Ext.getCmp('grid').getSelectionModel().getSelection(); 
            alert(selection);
            // var selection = getView().getSelectionModel().getSelection()[r];
            if (value) {
                alert(value);
                objStore.remove(value);
                objStore.sync();
            }
        };
        var onUpdateClick = function(field, value, options) {        
            alert('field= '   field   ' value= '  value  'options= '  options);
            objStore.update(objStore.getAt(value));
            onSync();
        };
        Ext.apply(this, {
            layout: 'fit',
            width: 800,
            //height: 1500,
            items: [{
                xtype: 'grid',
                id : 'gridgrid',
                //height: 300,
                store: objStore,
                selModel: { selType: 'cellmodel' },
                selType : 'rowmodel',
                plugins: [this.editing],
                // plugins: [cellEditing],
                columnLines: true,
                viewConfig: {stripeRows: true},
                //loadMask: true,
                disableSelection: true,
                listeners: {
                    selectionchange: function(selModel, selected) {
                        var selection = Ext.getCmp('gridgrid').getSelectionModel().getSelection(); 
                    }
                },
                columns: [
                    { header: 'rowid', hidden: true, dataIndex: 'ROWID'},
                    {
                        header: 'Indicator',
                        id: 'chkcolumn',
                        xtype: 'checkcolumn',
                        dataIndex: 'CHK_COL',
                        editor: {
                            xtype: 'checkbox',
                            cls: 'x-grid-checkheader-editor'
                        },
                        listeners : checkchange : function(column, recordIndex, checked)  
                        {
                            alert('checked rindex= '   recordIndex); 
                            onDeleteClick(column, recordIndex, checked);
                            //or send a request                    
                        } 
                    } 
                },                  
                {
                    id: 'employeeid',
                    header: 'employeeid',                       
                    width: 80, 
                    hidden: false,
                    sortable: true,
                    dataIndex: 'EMPLOYEEID',
                    flex: 1
                },
                {
                    id: 'NATIONALIDNUMBER',
                    header: 'NATIONALIDNUMBER',
                    width: 80, 
                    sortable: true,
                    dataIndex: 'NATIONALIDNUMBER',
                    flex: 1
                },
                {
                    id: 'MARITALSTATUS',
                    header: 'MARITALSTATUS',
                    width: 80, 
                    sortable: true,                      
                    dataIndex: 'MARITALSTATUS',
                    flex: 1
                },
                {
                    id: 'PotentialforInsourcingKV',
                    header: 'Potential for Insourcing', 
                    width: 30, 
                    sortable: true,                      
                    dataIndex: 'POTENTIAL_FOR_INSOURCING',
                    flex: 1,
                    editor: {
                    id: 'thiscombo',
                    xtype: 'combobox',
                    typeAhead: true,
                    triggerAction: 'all',
                    selectOnTab: true,
                    store: [
                        ['1', 'Yes'],
                        ['0', 'No']
                    ],
                    lazyRender: true,
                    listClass: 'x-combo-list-small',
                    listeners: { 'select' : function(r){
                    var selval  = Ext.getCmp("thiscombo").getValue();
                    //var recval  = Ext.getCmp("grid").getValue();
                    //var selection = getView().getSelectionModel().getSelection()[r]
                    alert(selval   ' '    rowIdx); 
                    // onUpdateClick(editor, rowIdx, value );
                }
            },
        }
    },
    {
        id: 'ABBREVIATED_MONTH',
        header: 'ABBREVIATED_MONTH',
        width: 80,
        sortable: true,
        dataIndex: 'ABBREVIATED_MONTH',
        flex: 1,
        renderer: this.renderMonth,
        field: {
            xtype: 'combobox',
            store: Ext.getStore(this.hiremonthstoreId),
            typeAhead: true,
            lazyRender: true,
            queryMode: 'local',
            displayField: 'ABBREVIATED_MONTH',
            valueField: 'MONTH_ID',
            listClass: 'x-combo-list-small'
        }
    },
    {
        id: 'SALARIEDFLAG',
        header: 'SALARIEDFLAG',
        width: 80, 
        sortable: true,                      
        dataIndex: 'SALARIEDFLAG',
        flex: 1
    }],
    features: [{
        ftype: 'rowbody'
    }]
}]
});
this.callParent(arguments);
//this.getSelectionModel().on('selectionchange', this.onSelectChange, this);
},  //initComponent
getSelectedRowIndex :  function(){
    var r, s;
    r = this.getView().getSelectionModel().getSelection();
    s = this.getStore();
    return s.indexOf(r[0]);
},
onSelectChange: function(selModel, selections){
    this.down('#delete').setDisabled(selections.length === 0);
},
onSync: function() {
    objStore.sync();
},
viewConfig: {},
});
 

Комментарии:

1. Возможно, будет полезно поделиться своим кодом, чтобы мы могли ответить на него за вас. В любом случае вы всегда можете добавить перехваты событий к CellEditing edit событию. Он имеет rowIdx свойство в EventObject. Но все это зависит от имеющегося у вас кода. Это всего лишь один из возможных вариантов.

2. При попытке отформатировать ваш код я обнаружил, что ваши фигурные скобки не совпадают. Помимо других ошибок, подобных этой строке: listeners : checkchange : function(column, recordIndex, checked) . Пожалуйста, сначала очистите свой код.

3. хотите верьте, хотите нет, «слушатели : checkchange : функция (столбец, recordIndex, проверено)» на самом деле отлично работает. Я посмотрю, что я могу сделать с фигурными скобками… Спасибо, что посмотрели на это!

Ответ №1:

Я прочитал в другом сообщении, что мне нужно было добавить прослушиватель к this.cellediting и использовать событие ‘beforeedit’, чтобы найти индекс строки, а затем установить значение variables:

     var  rIdx = '';
    var  cIdx = '';     
    this.cellEditing = Ext.create('Ext.grid.plugin.CellEditing', {
            clicksToEdit: 1,
    listeners: {
    'beforeedit': function(e){
    var me = this;
    var allowed = !!me.isEditAllowed;
    if (!me.isEditAllowed) 
    Ext.Msg.confirm('confirm', 'Are you sure you want edit?', function(btn){
                        if (btn !== 'yes') 
                            return;
                        me.isEditAllowed = true;
                        me.startEditByPosition({
                            row: e.rowIdx,
                            column: e.colIdx
                        });         
                    });
                 rIdx = e.rowIdx;
                 cIdx = e.colIdx;
                 alert('rIdx= '   rIdx   ' cIdx = '   cIdx);
                return allowed;
            },
            'edit': function(e){
                this.isEditAllowed = true;
    }
    }
    });