2016-03-10 2 views
1

Я хочу сортировать столбцы в моей сетке, точно так же, как строки. Я сделал простую функцию сортировки, которая вызывается из обработчика 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' 

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

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

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

+0

Взгляните на эту статью: https: //www.sencha.com/forum/showthread.php?133694-programatically-reorder-columns-in-gridpanel, grid.columnManager.columns могут вам помочь. –

ответ

1

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

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); 
1

Существует метод реконфигурации, который может быть использован для достижения переназначения, например:

grid.reconfigure(columns); 

Проверьте this.

+0

'reconfigure', похоже, не работает, если я просто переупорядочу старые столбцы. Он выдает ошибку 'Can not add destroy item 'gridcolumn-1631' to Container 'headercontainer-1634''. – Alexander

+0

Честно говоря, я не использовал перенастройку в Ext6. Однако, похоже, есть другой способ сделать это, проверьте ссылку :. https://www.sencha.com/forum/showthread.php?133694-programatically-reorder-columns-in-gridpanel&s=dab5710dcb68887b8e23d2f31d4903cf&p=1034910&viewfull=1#post1034910 – Zoran

1

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

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); 
Смежные вопросы