以编程方式更改网格列顺序
Programmatically change grid column order
我想对网格中的列进行排序,就像对行进行排序一样。我制作了一个从操作列处理程序调用的简单排序函数:
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'
这是因为 "old" 列先被销毁,然后 "new" 列被应用,它们相同因此被销毁。
我只想更改顺序,但我没有找到任何功能来执行此操作。你知道怎么做吗?
列的拖放排序有效,所以它是可行的;但我没有找到 sencha 实现拖放操作的源代码。您知道在哪里可以找到该代码吗?
有一个reconfigure方法可以实现重新排序,例如:
grid.reconfigure(columns);
检查this。
如果不在自定义字段中存储列并使用重新配置,我无法做到这一点,也许有人可以提出更好的建议(重新配置似乎不适用于常规列字段):
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);
重新配置方法需要两个参数
grid.reconfigure(store, columns)
这是以编程方式更改列的 fiddle https://fiddle.sencha.com/#fiddle/17bk
我发现列是网格 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);
我想对网格中的列进行排序,就像对行进行排序一样。我制作了一个从操作列处理程序调用的简单排序函数:
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'
这是因为 "old" 列先被销毁,然后 "new" 列被应用,它们相同因此被销毁。
我只想更改顺序,但我没有找到任何功能来执行此操作。你知道怎么做吗?
列的拖放排序有效,所以它是可行的;但我没有找到 sencha 实现拖放操作的源代码。您知道在哪里可以找到该代码吗?
有一个reconfigure方法可以实现重新排序,例如:
grid.reconfigure(columns);
检查this。
如果不在自定义字段中存储列并使用重新配置,我无法做到这一点,也许有人可以提出更好的建议(重新配置似乎不适用于常规列字段):
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);
重新配置方法需要两个参数
grid.reconfigure(store, columns)
这是以编程方式更改列的 fiddle https://fiddle.sencha.com/#fiddle/17bk
我发现列是网格 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);