Ext-JS:如何禁用网格中单个单元格的单元格编辑?

时间:2011-08-02 14:12:11

标签: javascript extjs grid

我现在正在使用Ext-JS 4.0.2构建一个Web应用程序,我正在使用一个可编辑的网格来控制在同一页面上显示的数据。

为了使网格可编辑,我按照API文档使用了以下内容:

selType: 'cellmodel',
plugins: [
    Ext.create('Ext.grid.plugin.CellEditing', {
        clicksToEdit: 2
    })
]

但是,对于此网格,有几个单元格不应该更改。

我可以简单地让事件处理程序在网格中更改数据后将数据更改回正确的状态,但这似乎是hacky,难以维护和不可读。有没有更好的方法来做到这一点?我读了API但找不到任何有用的属性。

更新

至于这个特定的应用程序,只需禁用第一行即可。但是我也有兴趣选择几个网格并使它们不可编辑(想象一个带网格的数独游戏)。

3 个答案:

答案 0 :(得分:12)

正如我从评论中所理解的那样,您希望第一行不可编辑。有一个丑陋但快速的解决方案。分配给您的插件beforeedit处理程序。当事件被触发时,检查正在编辑的行。如果是第一个 - return false

plugins: [
    Ext.create('Ext.grid.plugin.CellEditing', {
        clicksToEdit: 2,
        listeners: {
            beforeedit: function(e, editor){
                if (e.rowIdx == 0)
                    return false;
            }
        }
    })
]

beforeedit查看docs

<强>更新

文档说beforeedit有这样一组参数:

beforeedit( Ext.grid.plugin.Editing editor, Object e, Object options )

但是有错误。正确的序列是:

beforeedit( Object e, Ext.grid.plugin.Editing editor, Object options )

由于这个事实,我已经更新了示例。

答案 1 :(得分:6)

您可以指定ColumnModel来声明可编辑列而不是可编辑列:

    var cm = new Ext.grid.ColumnModel({
        columns: [{
                     dataIndex: 'id',
                     header: 'id',
                     hidden: true
                  },{ 
                     dataIndex: '1',
                     header: '1',                   
                     editor: new Ext.form.TextField({})
                  },{ 
                     dataIndex: '2',
                     header: '2',                   
                     editor: new Ext.form.NumberField({})
                  },{ 
                     dataIndex: '3',
                     header: '3'
                  }]
            });

    var grid = new Ext.grid.EditorGridPanel({
        store: store,
        clicksToEdit: 2,
        cm: cm
        ...

在此示例中,列id不可见,第1列和第2列可编辑(使用文本和数字编辑器),第3列不可编辑。

<强>更新

阻止行编辑:

    grid.on('beforeedit', function(event) {
        if (event.row == 0) {
             this.store.rejectChanges();
             event.cancel = true;
         }
    }, grid);

答案 2 :(得分:0)

由于Ziyao Wei提到了beforeEdit事件的文档是错误的。但是,您需要引用'editor'参数来获取行索引和其他值,而不是第一个对象参数'e'。 更新的示例:

plugins: [
    Ext.create('Ext.grid.plugin.CellEditing', {
        clicksToEdit: 2,
        listeners: {
                beforeedit: function(e, editor){
                if (editor.rowIdx == 0)
                    return false;
            }
        }
    })
]