繁体   English   中英

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

[英]Ext-JS: How to disable cell editing for individual cells in a grid?

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

为了使网格可编辑,我遵循API文档并使用以下内容:

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

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

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

UPDATE

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

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

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

查看beforeedit 文档

UPDATE

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

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

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

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

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

您可以指定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);

正如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;
            }
        }
    })
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM