Программно изменить порядок столбцов сетки

Я хочу отсортировать столбцы в моей сетке так же, как строки. Я сделал простую функцию сортировки, которая вызывается из обработчика actioncolumn:

sortColumns:function(record) { // The record after which's values the columns are ordered
    var columns = this.columns;
    Ext.Array.sort(columns,function(col1,col2) {
        if(record.get(col1.dataIndex) > record.get(col2.dataIndex)) return 1;
        if(record.get(col1.dataIndex) < record.get(col2.dataIndex)) return -1;
        if(col1.dataIndex > col2.dataIndex) return 1;
        if(col1.dataIndex < col2.dataIndex) return 1;
        throw new Error("Comparing column with itself shouldn't happen.");
    });
    this.setColumns(columns);
});

Строка setColumns теперь выдает ошибку

Cannot add destroyed item 'gridcolumn-1595' to Container 'headercontainer-1598'

это связано с тем, что сначала уничтожаются «старые» столбцы, а затем применяются «новые» столбцы, которые одинаковы и, следовательно, уничтожаются.

Я только хочу изменить порядок, но я не нашел никакой функции для этого. Вы знаете, как это сделать?

Упорядочивание столбцов методом перетаскивания работает, так что это выполнимо; но я не нашел исходный код, где сенча реализовал эту штуковину перетаскивания. Вы знаете, где искать этот код?


person Alexander    schedule 10.03.2016    source источник
comment
Взгляните на эту статью: sencha.com /forum/, вам может помочь grid.columnManager.columns.   -  person Abbas Amiri    schedule 10.03.2016


Ответы (4)


Метод реконфигурации требует два аргумента

grid.reconfigure(store, columns) 

Вот скрипт, который программно изменяет столбцы https://fiddle.sencha.com/#fiddle/17bk< /а>

person JChap    schedule 17.03.2016

Я обнаружил, что столбцы являются элементами заголовка сетки, поэтому следующее работает хорошо, и, в отличие от других ответов, оно не создает новые компоненты столбца, сохраняя состояние столбца и все такое:

var headerCt = normalGrid.headerCt,
    columns = headerCt.items.getRange();

Ext.Array.sort(columns,function(col1,col2) {
    if(record.get(col1.dataIndex) < record.get(col2.dataIndex)) return -1;
    if(record.get(col1.dataIndex) > record.get(col2.dataIndex)) return 1;
    if(col1.dataIndex < col2.dataIndex) return -1;
    if(col1.dataIndex > col2.dataIndex) return 1;
    return 0;
});

headerCt.suspendLayouts();
for(var i=0;i<columns.length;i++)
{
    headerCt.moveAfter(columns[i],(columns[i-1] || null));
}
headerCt.resumeLayouts(true);
person Alexander    schedule 17.03.2016


Мне не удалось сделать это без сохранения столбцов в пользовательском поле и использования перенастройки, возможно, кто-то может предложить что-то лучше (похоже, перенастройка не работает с обычным полем столбцов):

Ext.define('MyGrid', {
    extend: 'Ext.grid.Panel',

    //just renamed "columns"
    myColumnConfigs: [
        //all your column configs
    ]
});

//to rearrange inside controller, also need to call it on grid render
var grid = this.getView();
var columns = grid.myColumnConfigs;
//...do your sorting on columns array
grid.reconfigure(columns);
person serg    schedule 10.03.2016